2012-09-24 78 views
0

我有以下文本:PHP的正则表达式匹配表达式不包含模式

“这是一个测试文本,测试,逗号而不是空格。”

我遍历每个单词并希望将每个单词替换为不同的链接。比方说,

<a href="wordToReplace">wordToReplace</a> 

我的问题是,“测试”一词的连续两场比赛(使用上面的例子)更换href和锚文本,所以我离开了里面这是不好的,在所有的链接的链接。

(给我的问题的基本思路,这是我留下什么用。它有一些额外的标记。)

This is a<a href="/index.php?r<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt2">text</a>/addWord" class="wordLink 
info label" id="yt1">test</a>text.<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt3">Test</a><a 
href="/index.php?r=texts/addWord" class="wordLink info label" 
id="yt4">comma</a>instead of<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt6">space</a> 

我想

preg_replace("/[^\">]".$word."[^\"<]/", $link, $text->text); 

,但我不我认为我没有走上正轨。

感谢您的时间

+0

那岂不是更容易只是使用'str_replace()函数'? –

+0

在原稿上匹配,在使用位置的副本上进行替换,或者也可以使用替换上的起始偏移量,但您需要在计算时进行计算。 – Orbling

回答

1

从你的一行代码,我假设你有一个循环,线,通过所有的$words要替换,这将导致问题迭代。

您需要做的是将所有这些替换放入只有一个preg_replace调用。为此,正则表达式提供了替代方法。所以说,你的单词列表包括test,textthis。然后,你可以这样做:

preg_replace('/(test|text|this)/', $link, $text->text); 

如果你把所有的话在一个数组$words那么你就可以生成正则表达式简单地:

$wordList = implode('|', $words); 
preg_replace('/('.$wordList.')/', $link, $text->text); 

你可能想在最后添加i的正则表达式,如果你的支票应该是不区分大小写的。

在某些情况下,你的话是换句话说部位(例如要替换texttexture),你可以检查单词边界:

preg_replace('/\b('.$wordList.')\b/', $link, $text->text); 

这是你在找什么?

编辑:如果您$link是为在你之前,每个循环预$word产生的,你现在可以用$1替换词。如果您$link是像

$link = '<a href="'.$word.'">'.$word.'</a>'; 

你现在可以简单地使用

$link = '<a href="$1">$1</a>'; 
+0

为什么不使用单词边界运算符'\ b'? – trickyzter

+0

对不起,现在已经迟到了--.-- ...现在编辑它。 –

+0

可以理解。 ;) – trickyzter