我正在尝试解析具有多个缩写缩放的产品名称。例如,媒介可以是
m, medium, med
我尝试了一个简单的
preg_match('/m|medium|med/i',$prod_name,$matches);
适用于'product m xyz'。然而,当我尝试'产品s / m abc'时,我得到了一个假阳性的比赛。 我也试过
preg_match('/\bm\b|\bmedium\b|\bmed\b/i',$prod_name,$matches);
强制在一个单词中找到它,但是s / m中的m仍然匹配。我假设这是由于引擎将名称中的'/'视为单词分隔符?
总而言之,我需要在字符串中匹配'm',而不是's / m'或'small'等等。任何帮助都表示赞赏。
答案 0 :(得分:6)
%\b(?<![/-])(m|med|medium)(?![/-])\b%
您可以使用负向lookbehind或lookahead来排除有问题的分隔符。这意味着"m"/"med"/"medium"
这是它自己的单词,但不是斜杠或短划线之前或后面。它也适用于字符串的开头和结尾,因为负前瞻/后瞻不会强制出现匹配字符。
如果您只想分隔空格,可以使用正面版本:
%\b(?<=\s|^)(m|med|medium)(?=\s|$)\b%
("m"/"med"/"medium"
前面有空格或字符串的开头,后跟空格或字符串的结尾)
答案 1 :(得分:1)
我总是先在ERE中考虑这些事情。根据{{3}} ERE的单词边界,[[:<:]]
和[[:>:]]
分别匹配单词开头和结尾的空字符串。所以...因为preg应该理解ERE表示法,所以我可以选择:
/[[:<:]](m(ed(ium)?)?)[[:>:]]/
或者为了更容易阅读,或许:
/[[:<:]](m|med|medium)[[:>:]]/
在PHP中,您可以使用PREG而不是ERE。在PREG中,\b
表示单词边界,因此:
preg_match('/\b(m(ed(ium)?)?)\b/', $prod_name, $matches);
答案 2 :(得分:0)
试试这个,它应与medium
,med
和m
匹配。
medium|med|^m$