【问题标题】:PHP Regular Expression to replace word with linkPHP正则表达式用链接替换单词
【发布时间】:2010-09-27 16:52:30
【问题描述】:

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

示例:字符串“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”。

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

也许需要另一种方法?

提前非常感谢! 戴夫

【问题讨论】:

标签: php regex


【解决方案1】:

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

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

编辑:假设当文本包含“amazonas>grand canyon”之类的内容时您可以承受丢失

【讨论】:

    【解决方案2】:

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

    (<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>";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多