1

この関数は、テキスト内の単語 ($words 配列から) を検索し、それらを強調表示します。

function highlightWords(Array $words, $text){ // Loop through array of words
    foreach($words as $word){ // Highlight word inside original text
        $text = str_replace($word, '<span class="highlighted">' . $word . '</span>', $text);
    }         
    return $text; // Return modified text
}

問題は次のとおりです。

$words = array("car", "drive"); としましょう。

関数が車という単語だけでなく、車、カーマニアなどの「車」という文字を含む単語も強調表示する方法はありますか?

ありがとうございました!

4

3 に答える 3

1

あなたが望むのは正規表現、特に preg_replace または peg_replace_callback です(あなたのケースではコールバックが推奨されます)

<?php
$searchString = "The car is driving in the carpark, he's not holding to the right lane.\n";

// define your word list
$toHighlight = array("car","lane");

単語を検索するには正規表現が必要であり、時間の経過とともにバリエーションや変更が必要になる可能性があるため、正規表現を検索単語にハードコーディングすることはお勧めできません。したがって、array_map を使用して配列をウォークスルーし、検索語を適切な正規表現に変換するのが最善です (ここでは、/ で囲み、「句読点まですべてを受け入れる」式を追加するだけです)。

$searchFor = array_map('addRegEx',$toHighlight);

// add the regEx to each word, this way you can adapt it without having to correct it everywhere
function addRegEx($word){
    return "/" . $word . '[^ ,\,,.,?,\.]*/';
}

次に、見つけた単語を強調表示されたバージョンに置き換えたいとします。これは、動的な変更が必要であることを意味します。通常の preg_replace の代わりに preg_replace_callback を使用して、見つかったすべての一致に対して関数を呼び出し、それを使用して適切な結果を生成します。ここでは、見つかった単語を span タグで囲みます

function highlight($word){
    return "<span class='highlight'>$word[0]</span>";
}

$result = preg_replace_callback($searchFor,'highlight',$searchString);

print $result;

収量

The <span class='highlight'>car</span> is driving in the <span class='highlight'>carpark</span>, he's not holding to the right <span class='highlight'>lane</span>.

したがって、これらのコード フラグメントを次々と貼り付けるだけで、明らかに動作するコードを取得できます。;)

編集: 以下の完全なコードは少し変更されました = 元の要求者が簡単に使用できるようにルーチンに配置されました。+ 大文字と小文字を区別しない

完全なコード:

<?php

$searchString = "The car is driving in the carpark, he's not holding to the right lane.\n";
$toHighlight = array("car","lane");

$result = customHighlights($searchString,$toHighlight);

print $result;

// add the regEx to each word, this way you can adapt it without having to correct it everywhere

function addRegEx($word){
    return "/" . $word . '[^ ,\,,.,?,\.]*/i';
}

function highlight($word){
    return "<span class='highlight'>$word[0]</span>";
}

function customHighlights($searchString,$toHighlight){

// define your word list
$searchFor = array_map('addRegEx',$toHighlight);
$result = preg_replace_callback($searchFor,'highlight',$searchString);
return $result;

}
于 2012-05-28T20:45:23.870 に答える
0
function replace($format, $string, array $words)
{
    foreach ($words as $word) {
        $string = \preg_replace(
            sprintf('#\b(?<string>[^\s]*%s[^\s]*)\b#i', \preg_quote($word, '#')),
            \sprintf($format, '$1'), $string);
    }
    return $string;
}


// courtesy of http://slipsum.com/#.T8PmfdVuBcE
$string = "Now that we know who you are, I know who I am. I'm not a mistake! It
all makes sense! In a comic, you know how you can tell who the arch-villain's
going to be? He's the exact opposite of the hero. And most times they're friends,
like you and me! I should've known way back when... You know why, David? Because
of the kids. They called me Mr Glass.";

echo \replace('<span class="red">%s</span>', $string, [
    'mistake',
    'villain',
    'when',
    'Mr Glass',
]);

周囲の文字列の形式を使用しているsprintfため、それに応じて置換を変更できます。

5.4 構文ですみません

于 2012-05-28T21:01:11.410 に答える
0

私はそれをテストしていませんが、これでうまくいくはずです:-

$text = preg_replace('/\W((^\W)?$word(^\W)?)\W/', '<span class="highlighted">' . $1 . '</span>', $text);

これは、完全に区切られた単語内の文字列を探し、preg_replace と正規表現を使用して全体にスパンを配置します。

于 2012-05-28T20:31:09.993 に答える