我有以下文字:
“这是一个测试文本。测试,逗号而不是空格。”
我遍历每个单词,并希望将每个单词替换为不同的链接。我们说
<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);
但我认为我根本不在正确的轨道上。
感谢您的时间
答案 0 :(得分:1)
从您的一行代码中,我假设您在循环中拥有该行,该循环遍历您想要替换的所有$words
,这会导致问题。
您需要做的是将所有这些替换只放入一个preg_replace
来电。为此,正则表达式提供了替代方案。因此,您的字词列表包含test
,text
和this
。然后你可以这样做:
preg_replace('/(test|text|this)/', $link, $text->text);
如果您将所有单词放在数组$words
中,那么您只需使用以下内容生成正则表达式:
$wordList = implode('|', $words);
preg_replace('/('.$wordList.')/', $link, $text->text);
如果您的检查应该不区分大小写,您可能希望在正则表达式的最后添加i
。
如果您的某些单词是其他单词的一部分(例如,您想要替换text
和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>';