我有一系列单词,例如:
$matchWords = ['a','is','of'];
像这样的文字:
“这是一个测试文本。测试,逗号而不是空格。”
我需要替换以下 html 文本中 $wordsArray 中所有出现的单词:
<span style="color:red;">$wordMatched</span>
我需要用标签替换其他词。
所以基本上我的问题恢复到:
- 仅匹配世界(如果我搜索单词“a”而不是字母“a”;
- 不要匹配 html a和span标签内的任何内容;
所以,到目前为止,我的代码如下:
$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>?
我认为问题在于跨度标签。除此之外一切似乎都很好。