0

パーソナライズされたタグを作成できる bbcode パーサー クラスを実行しようとしていますが、URL に問題があります。

正規表現のおかげで特に問題なく必要なことはすべて実行しましたが、指定された URL を指す特別なタグを作成しようとすると問題が発生します。

私のクラスでは、次のようなメソッドを追加しました。

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$1</a>", $this->bbcode);
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

このコードは、従来の URL [url] http://ciao.com[/url] & [url= http://ciao.com]ciao[/url]で問題なく動作します。

しかし、last.fm スタイルの特別な URL サブジェクト ページの場合に問題があるので、[artist]Lemon Jelly[/artist].

bblink は< a href="http://ciao.com/artist/Lemon Jelly">Lemon Jelly </a> に変換されます (スペース < a> はリンク コードを表示するためだけに使用しました)。
リンクには href 属性に空白があるため、機能しません。

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        // begin of the problem
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path".str_replace (" ", "+", $1)."\">$1</a>", $this->bbcode);
        // end of the problem
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

これを回避するために、href url 部分を同じ URL に変更するコードの一部を書きましたが、" " 空白文字の代わりに "+" を使用したため、[artist]Lemon Jelly[/artist]< a href="http://ciao.com/artist/Lemon+Jelly">レモンゼリー</a>

私は PHP の経験がなく、何が問題なのかわかりません。問題が発生することなく、他の状況でこの構文を使用しました。

誰かが私が間違っている場所を見つけるのを手伝ってくれますか?

エラーの種類は PHP 解析エラーです: 構文エラー、予期しない T_LNUMBER、T_VARIABLE または '$' in /... が必要です。

4

4 に答える 4

2

エラーのある行の前後の 2 ~ 3 行を入力してください (行番号は PHP 解析エラーに含まれている必要があります。

これは正規表現の問題のようには聞こえません...エスケープの問題のようです。

私はSOにかなり慣れていないので、質問にコメントしてこれを尋ねることができなかったのはなぜですか(私が書いたものは実際には答えではないため)

于 2009-12-11T18:20:31.237 に答える
1

解析エラーは$1、有効な PHP 変数名ではないことが原因です。文字またはアンダースコアで始まる必要があります。パラメータに設定された$1変数は、preg_replaceパラメータ内で有効です。

このようなことをもっと試してください:

$this->bbcode = preg_replace("/\[$tag\]([$regex_url]*)\[\/$tag\]/e", "'<a title=\"Vai al link\" class=\"$css\" href=\"$url_path'. str_replace(' ', '+', '$1'). '\">$1</a>'", $this->bbcode);

修飾子はe置換文字列を PHP コードとして評価するため、必要な文字列が生成されます。

現時点ではテストできないため、少し調整する必要があるかもしれません。申し訳ありません:]
編集気にしないでください、私はFTPクライアントを手に入れました。正規表現を修正しました。できます :)

于 2009-12-11T18:30:31.547 に答える
0

これを避けるために、href url 部分を同じ URL に変更するコードの一部を書きましたが、" " の代わりに "+" を使用しました。

urlencodeタグの中身に使ってみませんか?

urlencode はクエリ パラメータにのみ使用する必要があることに注意してください。rawurlencodeHTTP 自体はスペースの代わりに + を使用しないため、実際のディレクトリ コンポーネントは を使用する必要があります。

于 2009-12-11T18:26:17.247 に答える
0

問題はstr_replace、引数の外側の関数で使用される $1 参照にあると思いpreg_replaceます。$1 後方参照は引数の範囲内でのみ機能するため、変数のように;preg_replaceに渡すことはできません。str_replace$1 を変数として使用しようとしますが、PHP では変数名として無効です。

于 2009-12-11T18:45:24.680 に答える