preg_replace应用字符串函数(如urlencode)替换

时间:2010-08-24 12:15:08

标签: php preg-replace

我想以这样的方式解析php中html文档字符串中的所有链接:将href ='LINK'替换为href ='MY_DOMAIN?URL = LINK',因为LINK将是url参数,它必须是urlencoded。我正试图这样做:

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

但'$ {1}'只是字符串文字,不是在preg url中创建的,我需要做什么才能使这段代码正常工作?

2 个答案:

答案 0 :(得分:10)

嗯,要回答你的问题,你有两个选择Regex。

您可以使用e modifier到正则表达式,它告诉preg_replace替换是php代码并且应该执行。这通常被视为不太好,因为它实际上并不比eval好......

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

另一个选项(更好的恕我直言)是使用preg_replace_callback

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

但也永远不会忘记,don't parse HTML with regex ......

所以在实践中,更好的方法(更强大的方式)是:

$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();

答案 1 :(得分:0)

使用'e'修饰符。

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

http://uk.php.net/preg-replace - 示例#4