PHP正则表达式匹配不包含模式的表达式

时间:2012-09-24 18:53:57

标签: php regex preg-replace

我有以下文字:

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

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

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

我的问题是“test”这个单词的连续匹配(使用上面的例子)会替换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);

但我认为我根本不在正确的轨道上。

感谢您的时间

1 个答案:

答案 0 :(得分:1)

从您的一行代码中,我假设您在循环中拥有该行,该循环遍历您想要替换的所有$words,这会导致问题。

您需要做的是将所有这些替换只放入一个preg_replace来电。为此,正则表达式提供了替代方案。因此,您的字词列表包含testtextthis。然后你可以这样做:

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>';