在PHP中自然语言单词替换

时间:2012-09-27 03:13:51

标签: php regex preg-replace

我有一系列的词语:

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

和文字一样:

  

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

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

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

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

基本上我的问题恢复到:

  • 仅匹配世界(如果我搜索单词“a”而不是字母 “一个”;
  • 请勿匹配html内的任何内容 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回答之后,我测试了以下文本,并且出现了以下内容:

  

您好,

     

这是一个跨度的测试。

     

它真的有用吗?

输出:

<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>?

我认为问题出在span标签上。除此之外,一切似乎都很好。

1 个答案:

答案 0 :(得分: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);