正则表达式:仅当字符串不在标记之间时才获取字符串

时间:2014-08-21 16:02:52

标签: regex

我正在搜索并替换某些字词,添加这些字词的链接。如果这些单词已经是另一个链接的一部分,我应该避免替换它(如果没有,我应该以{{1​​}}结尾,这是我想要避免的。

我不知道这是否可行,所以我想知道,如果是的话,任何提示。我有点迷茫。到目前为止,我只能得到那些属于链接的词,而不是那些完全没有的词。

谢谢!

2 个答案:

答案 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以获得所有匹配而不仅仅是第一个匹配。