4

我正在尝试解析具有多个尺寸缩写的产品名称。例如,介质可以是

m, medium, med

我尝试了一个简单的

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

这适用于“产品 m xyz”。但是,当我尝试“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%

您可以使用否定的lookbehind 或lookahead 来排除有问题的分隔符。这意味着"m"/"med"/"medium"which 是它自己的单词,但不能在斜线或破折号之前或之后。它也适用于字符串的开头和结尾,因为负前瞻/后瞻不会强制匹配字符出现。

如果您只想分隔空格,则可以使用正版:

%\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 中,您可以使用 PREG 代替 ERE。在 PREG 中,\b表示一个字边界,因此:

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

试试这个,它应该匹配medium,medm.

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