0

我有以下文字:

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

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

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

但我认为我根本没有走在正确的轨道上。

谢谢你的时间

4

1 回答 1

1

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

您需要做的就是将所有这些替代品放在一个preg_replace电话中。为此,正则表达式提供了替代方案。比如说,您的单词列表由testtext组成this。然后你可以这样做:

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

如果您将所有单词都放在一个数组中,$words那么您可以简单地生成正则表达式:

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

i如果您的检查应该不区分大小写,您可能希望在正则表达式的最后添加一个。

如果您的某些单词是其他单词的一部分(例如,您想替换textand texture),您可以检查单词边界:

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

这是你想要的?

编辑:如果你之前在你的循环$link中预先生成了$word你,你现在可以用$1. 如果你$link是这样的

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

你现在可以简单地使用

$link = '<a href="$1">$1</a>';
于 2012-09-24T20:12:37.617 回答