0

次のような単語の配列があります。

$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 の正規表現をあまり理解していません。

ありがとう

--編集-- xdazzの回答の後、次のテキストをテストしたところ、次の結果が得られました。

やあ、

これは、いくつかのスパンの aa aaaa テストです。

それは本当に働いていますか?

出力:

<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 タグにあると思います。それ以外はすべて良さそうです。

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 に答える