【问题标题】:How to replace words with preg_replace without duplicates?如何用 preg_replace 替换单词而不重复?
【发布时间】:2010-12-18 21:17:11
【问题描述】:

我想创建一个 PHP 函数,它将用内部链接替换文本中的某些单词。到目前为止有效,但如果我有两个匹配项,我最终会得到无效的 HTML 代码。

例子:

韦尔彭/hunde 吉娃娃 Welpen /hunde,chihuahua
function seo_internal_links($str, $links, $limit) {
    foreach($links AS $link){
        $pattern[$k] = "~\b($link[phrase])\b~i";
        $replace[$k] = '<a href="'.$link[link].'">\\1</a>';
        $k++;
    }
    return preg_replace($pattern,$replace,$str, $limit);
}

seo_internal_links($ad[text], $seo_internal_links, $limit = 1);

这将导致:

<a href="//hunde,chihuahua">Chihuahua <a href="/hunde">Welpen</a></a>

有人知道如何避免这种情况吗?我也想限制命中的数量,但是 preg_replace 中的限制只考虑唯一的单词,而不是整个数组。


一些额外的解释。

我正在从表格中提取要替换的单词及其对应的替换词。有数百个。

    $stmt ="
    SELECT *
    FROM $T73
    ORDER BY prio desc
";
$result = execute_stmt($stmt, $link);
while ($row = mysql_fetch_object($result)){     
    $seo_internal_links[$row->ID]['phrase'] = $row->phrase;
    $seo_internal_links[$row->ID]['link'] = $row->link;
}

$my[text] = seo_internal_links($my[text], $seo_internal_links, $limit = 1);

问题出现了,因为替换函数会再次从文本的开头开始搜索下一个单词。相反,它应该在文本中继续。

我的目标是在充满关键字的表格中找到相关字词时插入指向我网站文本的内部链接。例如将“beagle welpen”替换为“beagle welpen”。如果“welpen”一词也在表格内,则会破坏html代码并重新插入href标签。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    不要使用循环,而是构造一个正则表达式并一次修改整个文档。也就是说,而不是这些正则表达式:

    ~\b(foo)\b~i
    ~\b(bar)\b~i
    ~\b(baz)\b~i
    

    只用这个:

    ~\b(foo|bar|baz)\b~i
    

    您可能想看看使用implode 来构造正则表达式。

    您还需要注意正则表达式中具有特殊含义的字符。您可能会发现 preg_quote 对此很有用。

    【讨论】:

    • 别忘了preg_quote()
    • 您好,感谢您的帮助。您的建议在我的示例中可能不起作用。请参阅我上面的附加解释。我需要循环浏览数百个可能的单词和替换词。
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 2021-08-01
    • 2011-04-08
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多