正则表达式匹配长度为1个字符的'word'

时间:2012-05-29 23:02:37

标签: php regex

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

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'等等。任何帮助都表示赞赏。

3 个答案:

答案 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)

试试这个,它应与mediummedm匹配。

medium|med|^m$