如何用preg_replace替换单词而不重复?

mer*_*lin 1 php regex

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

例:

Welpen               /hunde  
Chihuahua 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);
Run Code Online (Sandbox Code Playgroud)

这将导致:

<a href="//hunde,chihuahua">Chihuahua <a href="/hunde">Welpen</a></a>
Run Code Online (Sandbox Code Playgroud)

有人知道如何避免这种情况吗?我还想限制命中量,但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);
Run Code Online (Sandbox Code Playgroud)

问题发生,因为替换功能将再次从文本的开头开始搜索下一个单词.相反,它应该继续在文本中.

我的目标是只要在一个充满关键字的表格中找到相关单词,就可以在我的网站文本中插入内部链接.例如,将"beagle welpen"替换为"beagle welpen.如果单词"welpen"也在表格内,它将破坏html代码并再次插入href标签.

Mar*_*ers 8

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

~\b(foo)\b~i
~\b(bar)\b~i
~\b(baz)\b~i
Run Code Online (Sandbox Code Playgroud)

使用这一个:

~\b(foo|bar|baz)\b~i
Run Code Online (Sandbox Code Playgroud)

您可能希望查看implode用于构造正则表达式.

您还需要注意在正则表达式中具有特殊含义的字符.你可能觉得preg_quote这很有用.