我有一种情况,我解析一个文本正文并用链接替换某些短语。然后我需要重新解析字符串以用链接替换第二组短语。问题出现在这一点上,第二组中的某些单词或短语可以是第一遍中已经替换的短语的子串。
示例:第一遍过后,字符串“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>
标签进行检查,但无法使这些标记生效。
可能还需要另一种方法吗?
非常感谢提前! 戴夫
答案 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>";
}