1


0

preg_replaceは、置換に文字列関数(urlencodeなど)を適用します

私はそのような方法でPHPのHTML文書文字列のすべてのリンクを解析したい:href = 'LINK’をhref = 'MY_DOMAIN?URL = LINK’に置き換えます。 私はそうしようとしています:

preg_replace('/href="(.+)"/', 'href="http://'.$host.'/?url='.urlencode('${1}').'"', $html);

しかし、 '$ \ {1}'は単なる文字列リテラルであり、preg urlにはありません。このコードを機能させるにはどうすればよいですか?

2 Answer


10


さて、あなたの質問に答えるには、Regexで2つの選択肢があります。

正規表現に対してhttp://us.php.net/manual/en/function.preg-replace.php [e`修飾子]を使用できます。これは、置換がphpコードであり、実行する必要があることを preg_replace`に伝えます。 これは通常、あまり評価されていないと見なされます。

preg_replace($regex, "'href=\"http://{$host}?url='.urlencode('\\1').'\"'", $html);

他のオプション(より良いIMHO)は、http://us.php.net/manual/en/function.preg-replace-callback.php [preg_replace_callback]を使用することです:

$callback = function ($match) use ($host) {
    return 'href="http://'.$host.'?url='.urlencode($match[1]).'"';
};
preg_replace_callback($regex, $callback, $html);

しかし、忘れないでください、http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html [正規表現でHTMLを解析しない] …​

したがって、実際には、より良い方法(より堅牢な方法)は次のようになります。

$dom = new DomDocument();
$dom->loadHtml($html);
$aTags = $dom->getElementsByTagName('a');
foreach ($aTags as $aElement) {
    $href = $aElement->getAttribute('href');
    $href = 'http://'.$host.'?url='.urlencode($href);
    $aElement->setAttribute('href', $href);
}
$html = $dom->saveHtml();


0


「e」修飾子を使用します。

preg_replace('/href="([^"]+)"/e',"'href=\"http://'.$host.'?url='.urlencode('\\1').'\"'",$html);