0

我有一系列单词,例如:

$matchWords = ['a','is','of'];

像这样的文字:

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

我需要替换以下 html 文本中 $wordsArray 中所有出现的单词:

<span style="color:red;">$wordMatched</span>

我需要用标签替换其他词。

所以基本上我的问题恢复到:

  • 仅匹配世界(如果我搜索单词“a”而不是字母“a”;
  • 不要匹配 html aspan标签内的任何内容;

所以,到目前为止,我的代码如下:

$wordsArray = ['this','is','a','test','text','comma','instead','of','space'];
$matches = ['a','is','of'];
$text = "This is a test text. Test, comma instead of space.";

foreach($wordsArray as $word){
    if(in_array($word, $matches)){
        $known[] = '(^|[.!?: ;,])'.$word.'([.!?: ;,]|$)';
    }
    else{
        $notKnown[] = '(^|[.!?: ;,])'.$word.'([.!?: ;,]|$)';
    }
}

// Known
$wordList = implode('|', $known);
$text = preg_replace('/('.$wordList.')/', '<span>$1</span>', $text);

// Not Known
$wordList = implode('|', $notKnown);
$text = preg_replace('/('.$wordList.')/', '<a href="texts/addWord&word=$1" class="info label">$1</a>', $text);

这不起作用,因为它将空格和分隔符添加到我的匹配项中。

老实说,我不太了解 php 中的正则表达式,所以如果有人可以在这里帮助我,那就太好了。

谢谢

--EDIT-- 在 xdazz 回答后,我测试了以下文本,结果如​​下:

你好,

这是对一些跨度事物的 aaaaa 测试。

它真的有效吗?

输出:

<a class="wordLink info label" href="texts/addWord&word=Hi">Hi</a>,<br />
<br />
<a class="wordLink info label" href="texts/addWord&word=This">This</a> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">is</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <a class="wordLink info label" href="texts/addWord&word=aa">aa</a> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">a</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">a</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">a</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">a</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <a class="wordLink info label" href="texts/addWord&word=test">test</a> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">of</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <a class="wordLink info label" href="texts/addWord&word=some">some</a> <a class="wordLink info label" href="texts/addWord&word=span">span</a> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">thing</<a class="wordLink info label" href="texts/addWord&word=span">span</a>>.<br />
<br />
<a class="wordLink info label" href="texts/addWord&word=Is">Is</a> <<a class="wordLink info label" href="texts/addWord&word=span">span</a> style="color:red;">it</<a class="wordLink info label" href="texts/addWord&word=span">span</a>> <a class="wordLink info label" href="texts/addWord&word=really">really</a> <a class="wordLink info label" href="texts/addWord&word=working">working</a>?

我认为问题在于跨度标签。除此之外一切似乎都很好。

4

1 回答 1

2

像这样的东西:

$matchWords = array('a','is','of'); 
$text = "This is a test text. Test, comma instead of space.";
$text = preg_replace('/\b('.implode('|', $matchWords).')\b/', '<span style="color:red;">$1</span>', $text);
于 2012-09-27T03:22:31.143 回答