0

文字列のphpで検索と置換を行っています。

私の例の文字列が

私の名前はマシュー・スコット・ヘイルウッドです

次に、関数を実行してo出力を検索すると、次のようになります (読みやすくするために複数行に分割されています)。

My name is 
Matthew 
Sc<span class="highlight">o</span>tt 
Hailw<span class="highlight">o</span><span class="highlight">o</span>d

その部分は完璧に機能します。

私のcssクラスは

.highlight{
    font-weight: bold;
    background-color: yellow;
    border: 1px dotted #a9a9a9;
}

これも完璧に機能します。

ただしoo、姓などの二重文字の場合、中央の境界線の太さは 2 倍になります。

私がやろうとしているのは、次のいずれかです。2 つある場合は中央の境界線をまとめて削除するか、2 つの境界線を 1 つに折りたたむ可能性が高いです。

私のphp関数は

function highlight($haystack, $needle, 
                   $wrap_before = '<span class="text_highlight">', 
                   $wrap_after = "</span>"){
    if($needle == '')
        return $haystack;
    $needle = preg_quote($needle);
    return preg_replace("/({$needle})/i", $wrap_before."$1".$wrap_after, $haystack);
}
4

1 に答える 1

3

正規表現を使用する場合、正規/({$needle}+)/i表現は単一のoとともにoのグループと一致します。したがって、変更したコードは次のようになります。

function highlight($haystack, $needle, 
                   $wrap_before = '<span class="text_highlight">', 
                   $wrap_after = "</span>"){
    if($needle == '')
        return $haystack;
    $needle = preg_quote($needle);
    return preg_replace("/({$needle}+)/i", $wrap_before."$1".$wrap_after, $haystack);
}

前の+1つ以上の文字(またはグループの文字)と一致します。

于 2012-07-25T03:35:24.497 に答える