4

サイズの省略形が複数ある製品名を解析しようとしています。たとえば、メディアは

m, medium, med

簡単にやってみました

preg_match('/m|medium|med/i',$prod_name,$matches);

これは「productmxyz」で正常に機能します。ただし、「product s / m abc」を試してみると、誤検知の一致が発生します。私も試しました

preg_match('/\bm\b|\bmedium\b|\bmed\b/i',$prod_name,$matches);

単語内で強制的に検出されますが、s/mのmはまだ一致しています。これは、エンジンが名前の「/」を単語の区切り文字として扱っているためだと思いますか?

したがって、要約すると、文字列内の「m」と一致する必要がありますが、「s/m」や「small」などは一致しません。助けていただければ幸いです。

4

3 に答える 3

6
%\b(?<![/-])(m|med|medium)(?![/-])\b%

ネガティブルックビハインドまたはルックアヘッドを使用して、問題のあるセパレータを除外できます。これは"m"/"med"/"medium"、どちらがそれ自体の単語であるかを意味しますが、スラッシュやダッシュの前後にはありません。負の先読み/後読みは一致する文字を強制的に存在させないため、文字列の最初と最後でも機能します。

空白だけで区切る場合は、ポジティブバージョンを使用できます。

%\b(?<=\s|^)(m|med|medium)(?=\s|$)\b%

"m"/"med"/"medium"前に空白または文字列の先頭があり、その後に空白または文字列の終わりが続きます)

于 2012-05-29T23:11:12.307 に答える
1

私はいつもEREでこれらのことを最初に考えます。そして、re_format(7) EREの単語境界に従って、単語の最初[[:<:]][[:>:]]最後のヌル文字列にそれぞれ一致します。だから...pregはERE表記を理解する必要があるので、私は次のように行くかもしれません:

/[[:<:]](m(ed(ium)?)?)[[:>:]]/

または、読みやすくするために、おそらく:

/[[:<:]](m|med|medium)[[:>:]]/

ただし、PHPでは、EREの代わりにPREGを使用できます。PREGでは\b、単語の境界を示します。したがって、次のようになります。

preg_match('/\b(m(ed(ium)?)?)\b/', $prod_name, $matches);
于 2012-05-30T01:40:39.633 に答える
0

mediumこれを試してください。 、、、medおよびと一致する必要がありmます。

medium|med|^m$
于 2012-05-29T23:09:03.190 に答える