0

href を url パラメータとして渡して、いくつかのタグを別のページにリダイレクトしようとしています。私が使用しているコードは次のようなものです:

preg_replace(
    "/<a(\s[^>]*)href=[\"\']??([^\" >]*?)[\"\']??([^>]*)>(.*)<\/a>/siU", 
    "<a$1href=\"".WWW."go.php?to=".urlencode("$2")."\"$3>$4</a>", $text
);

これは、ここにある正規表現の修正版です。このブロックでこのコードを使用します。

$text = "<...some other tags...><a target=\"_blank\" href=\"http://www.google.com\" style=\"...\" class=\"...\">Google</a></...some other tags...>";

そして、それは正しくキャプチャされますが、を使用すると、 preg 変数に格納されている値ではなく、文字列を受け取ります(私がそうするように) urlencode("$2")"$2"これは urlencode に限定されませんが、これをパラメーターとして他の関数に渡します。したがって、これをエンコードするだけでなく (URL を受け入れるために正規表現をもう少し拡張することもできます)、通常はメソッド内で変数を使用します。

これに対する回避策を知っていますか?前もって感謝します。

4

1 に答える 1

3

文字列 "$2" を URL エンコードしてから、URL エンコードされた文字列が置換に使用されるため、これは完全に正常です。

"<a$1href=\"".WWW."go.php?to=$2\"$3>$4</a>" 

2 番目のパラメーターとして。urlencode を評価する場合は、次のように e (eval 用) フラグを使用する必要があります。

preg_replace(
    "/<a(\s[^>]*)href=[\"\']??([^\" >]*?)[\"\']??([^>]*)>(.*)<\/a>/seiU", 
    "'<a$1href=\"'.WWW.'go.php?to=\"'.urlencode('$2').'\"$3>$4</a>'", $text
);

別の好ましい解決策は、不明な文字列の評価に依存しないように preg_replace_callback を使用することです。

于 2012-04-25T14:04:48.100 に答える