0

大きな文字列の中に部分文字列が存在するかどうかを調べようとしています。一致は正確でなければなりません。ほとんどの場合、以下のシナリオで動作しますが、そうではありませんが、完全に一致すると表示されます。

$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"

if(preg_match('/^.*(\b'.$partnumber.'\b).*$/i', $productname)){
      echo "****************Exact Match****************";
}

$partnumber = '4.7585.880' の場合にのみ一致します。

注として、部品番号は変更される可能性があり、数字、文字、小数点またはダッシュが含まれる可能性があります。

4

2 に答える 2

2

次を使用して $partnumber をエスケープする必要がありますpreg_quote()

$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"

if(preg_match('/[^\B\.]'.preg_quote($partnumber).'[^\B\.]/i', $productname)){
    echo "****************Exact Match****************";
}

また、行の開始と終了、およびそれを囲む可能性のあるすべてのものではなく、部品番号を検索するだけで、正規表現を簡素化しました。

于 2012-10-16T05:47:19.143 に答える
1

\b正規表現識別子は単語境界に一致します。単語の文字は [a-zA-Z0-9_] として定義されるため、\b は単語の文字と単語以外の文字の境界に一致します。また、最初 (または最後) の文字が単語の文字である場合、文字列の最初 (または最後) にも一致します。(詳しくはこちらをご覧ください。)

あなたの例では、2番目の「。」は単語以外の文字であるため、正規表現と一致します。部品番号が常に文の途中にある場合は、\s を使用して前後の空白を一致させることができます。文の最後にある可能性がある場合 (つまり、「.」が続く場合)、一致に続く文字を見て、一致が完全かどうかを確認できる、より複雑な正規表現が必要になると思います。

また、Omar Jackman が言ったように、部品番号をエスケープする必要があります。提供された例では、製品名「Eibach 4X7585 Sport Plus Kit」も一致します。部品番号の は、正規表現の一部として解釈されます。この質問に従って、preg_quoteは、それを行うために探しているphp関数です。

于 2012-10-16T06:01:06.880 に答える