指定正则表达式首选项(优先顺序重要)

时间:2014-12-15 05:12:41

标签: php regex

我有以下正则表达式尝试解析字符串中的价格:

  $pattern = '#([Ii][Dd][Rr].?\s*[0-9.,]+)|
                ([Rr][Pp].?\s*[0-9.,]+)|
                ([Pp][Rr][Ii][Cc][Ee]:?\s*[0-9.,]+)|
                (\s[0-9]+\s?[Kk]\s)|
                ([0-9]+[Rr][Bb])|
                ([0-9.,]+\s*[Rr][Ii][Bb][Uu])|
                (\b[0-9]+[.,][0-9]+[.,]?[0-9]+)#u';
 $matches = array();
 preg_match($pattern, $caption, $matches);

使用以下字符串进行测试时:

"ABBY TOP
 Colour : POLKA BLACK
 Weight : 0,18
 Price : 185,000
 Material : Kaos Semi-Fleece
 Size : Panjang / Length: 55 cm (depan), 72 (belakang)"

这总是将0.18解析为价格,而我希望Price: 185,000成为实际价格。 我的正则表达式有什么问题吗?

1 个答案:

答案 0 :(得分:1)

没有冒犯,但......在我给你答案之前,让我指出你在你的正则表达式中应用的许多修正。

在您尝试双重案例匹配时,[Ii][Dd][Rr]不是一个好主意:像往常一样使用idr,但请加入case-insensitive flag: #i

Using \d over [0-9] makes the world happier.

此外,您的价格条目为Price : 185,000,但由于冒号前的空格,子模式([Pp][Rr][Ii][Cc][Ee]:?\s*[0-9.,]+)将无法捕获它。添加\s*

另见:

现在回到考虑优先级。您可以使用this other answer of mine中的相同技术,这会产生正则表达式:

/^.*?\Kidr.?\s*[\d.,]+|
.*?\Krp.?\s*[\d.,]+|
.*?\Kprice:?\s*[\d.,]+|
.*?\K\s\d+\s?k\s|
.*?\K\d+rb|
.*?\K[0-9.,]+\s*ribu|
.*?\K\b\d+[.,]\d+[.,]?\d+/xis
Regex101 Demo