3

私はかなり基本的な状況にあり、文字列の配列があり、単一の文字列でこれらのすべての一致を見つけて、それらの周りに強力なタグを付けたいと考えています。これは私がこれまでに持っているものです:

$searchWords = array("test","this","s");

for($i=0;$i<sizeof($searchWords);$i++) {
    $searchWords[$i] = "/".preg_quote($searchWords[$i])."/i";
}

$label = "This is a test string.";

$result = preg_replace($searchWords, "<strong>$0</strong>", $label);

echo($result);

問題は、preg_replace 関数が "s" 検索語を強力なタグに置き換えているように見えることです。だから私は次のようになります:

<strong>Thisstrong> は <strong>teststrong> です。

私が本当に欲しいのは:

<strong>これ</strong>は<strong></strong><strong>テスト</strong>です。

それで、私が間違っているところを教えてもらえますか?

どんな助けでも大歓迎です。私はこれについて髪を引き裂いており、近くにいる必要があります。

4

2 に答える 2

3

3回の交換は必要ありませんが、1回の交換を行います。

$result = preg_replace("#" . implode($searchWords, "|") . "#", "<strong>$0</strong>", $label);

hakreの編集:これは、これまたはあれまたはあの文字列のように機能します。最初の試合が行われます。したがって、最も長い文字列から始めて、最後の文字列として最小の文字列を取ります。

この編集に関するバイナリの回答:コメントを参照


完全版:

<?php
$searchWords = array("t", "test", "this");
usort($searchWords, function ($a, $b) { return strlen($b) - strlen($a); });

foreach ($searchWords as &$word)
{
    $word = preg_quote($word);
}
unset($word);

$label = "This is a test string.";

$searchWords = implode($searchWords, "|");
$result = preg_replace("#{$searchWords}#i", "<strong>$0</strong>", $label);

echo($result);
于 2012-07-06T12:27:05.743 に答える