preg_replace函数将字符串附加到页面的所有超链接

时间:2010-05-17 12:18:08

标签: php regex preg-replace

我想将自己的值附加到页面中的所有超链接...例如,如果有链接:

<a href="abc.htm?val=1">abc 1</a> <br/>
<a href="abc.htm?val=2">abc 1</a> <br/>
<a href="abc.htm?val=3">abc 1</a> <br/>
<a href="abc.htm?val=4">abc 1</a> <br/>

我想在所有超链接

中添加类似“type = int”的下一个var 输出应该是:

<a href="abc.htm?val=1&type=int">abc 1</a> <br/>
<a href="abc.htm?val=2&type=int">abc 1</a> <br/>
<a href="abc.htm?val=3&type=int">abc 1</a> <br/>
<a href="abc.htm?val=4&type=int">abc 1</a> <br/>

我希望使用preg_replace函数

可以很容易地完成

4 个答案:

答案 0 :(得分:4)

如果只是将变量附加到href属性,那么这将有效:

#                                              v-- &amp; instead of & for W3C validation
preg_replace('/(<a\\s+[^>]+href="[^"]*)(")/', '${1}&amp;type=int$2', $page_src);

但是如果你想要代码耐用,那么href="index.php"会变成href="index.php?type=int"而不是href="index.php&type=int",那么你需要额外检查一下:

function process_link_matches ($matches) {
    # get rid of full matching string; all parts are already covered
    array_shift($matches);

    if (preg_match('/\\?[^"]/', $matches[2])) {
        # link already contains $_GET parameters
        $matches[1] .= '&type=int';
    } else {
        # starting a new list of parameters
        $matches[1] .= '?type=int';
    }

    return implode($matches);
}

$page_src = preg_replace_callback('/(<a\\s+[^>]+href=")([^"]*)("[^>]*>)/', 
    'process_link_matches', $page_src);

答案 1 :(得分:2)

您可以使用output bufferoutput_add_rewrite_var来执行此操作。您可能需要调整url_rewriter.tags以仅重写href元素的a属性。

答案 2 :(得分:1)

您可以使用

preg_replace('/(\<a [^>]*href=")([^"]*)"/i', '&\1\2type=int"', page);

但请注意,这可能会破坏任意html文件。我建议仅将Regex用于HTML操作作为一次性操作。如果您需要更频繁地或大量文件,请考虑使用HTML解析器。

答案 3 :(得分:0)

我不是regexp专家,但这听起来像你应该考虑使用会话或cookie ......