我正在搜索并替换某些字词,添加这些字词的链接。如果这些单词已经是另一个链接的一部分,我应该避免替换它(如果没有,我应该以{{1}}结尾,这是我想要避免的。
我不知道这是否可行,所以我想知道,如果是的话,任何提示。我有点迷茫。到目前为止,我只能得到那些属于链接的词,而不是那些完全没有的词。
谢谢!
答案 0 :(得分:2)
您可以这样做:
$urls = array('word1'=> 'http://urlfor.word1.com',
'word2'=> 'http://urlfor.word2.com',
'word3'=> 'http://urlfor.word3.com');
$pattern = '~<(?:a\s.*?</a>|!--.*?(?:-->|$)|[^>]+>)(*SKIP)(*FAIL)|\b(?:word1|word2|word3)\b~sD';
$result = preg_replace_callback($pattern, function($m) use ($urls) {
return '<a href="' . $urls[$m[0]] . '">' . $m[0] . '</a>'; },
$html);
$urls
是一个关联数组,其中键是单词,值是对应的URL。
模式使用(*SKIP)(*FAIL)
技巧跳过链接标记之间,标记内或html注释中的部分。 (请注意,您可以轻松扩展模式以跳过脚本,样式和CDATA内容或处理未关闭的<a>
标记)
答案 1 :(得分:0)
这有效:
~<(?:a\s.*?</a>|[^>]+>)(*SKIP)(*FAIL)|\b(?:ultrices)\b~ig
添加g以获得所有匹配而不仅仅是第一个匹配。