PHP正则表达式用链接替换单词

时间:2008-12-19 11:46:48

标签: php regex

我有一种情况,我解析一个文本正文并用链接替换某些短语。然后我需要重新解析字符串以用链接替换第二组短语。问题出现在这一点上,第二组中的某些单词或短语可以是第一遍中已经替换的短语的子串。

示例:第一遍过后,字符串“blah blah grand canyon blah”将成为“blah blah <a href="#">grand canyon</a> blah”。第二遍可能会尝试用链接替换“canyon”这个词,因此产生的,破碎的文本会显示为:“blah blah <a href="#"> grand <a href="#"> canyon </a></a> blah”。< / p>

所以我一直在尝试使用preg_replace和正则表达式来防止嵌套的<a>标记出现 - 只需替换链接中尚未存在的文本。我试图根据文本中是否还有</a>标签进行检查,但无法使这些标记生效。

可能还需要另一种方法吗?

非常感谢提前! 戴夫

2 个答案:

答案 0 :(得分:1)

这可能适用于所有通行证:

$string = preg_replace('/([^>]|^)grand canyon\b/','$1<a href=#>grand canyon</a>',$string);

编辑:假设当文本中包含“amazonas&gt;大峡谷”之类的内容时,你可以负担得起。

答案 1 :(得分:0)

对于第二遍,您可以使用正则表达式,例如:

(<a[^>]*>.*?</a>)|grand

此正则表达式匹配链接或单词“grand”。如果链接匹配,则将其捕获到第一个(也是唯一的)捕获组中。如果组匹配,只需重新插入现有链接即可。如果单词grand匹配,您知道它在链接之外,您可以将其转换为链接。

在PHP中,您可以使用preg_replace_callback执行此操作:

$result = preg_replace_callback('%(<a[^>]*>.*?</a>)|grand%', compute_replacement, $subject);

function compute_replacement($groups) {
    // You can vary the replacement text for each match on-the-fly
    // $groups[0] holds the regex match
    // $groups[n] holds the match for capturing group n
    if ($groups[1]) {
        return $groups[1];
    } else {
        return "<a href='#'>$groups[0]</a>";
}