PHP:可选的捕获组

时间:2016-08-27 18:10:50

标签: php regex

我有两种表达方式:

  • ABC
  • abc(说明)

我希望能够捕获主要文本解释[在括号中],如果存在

我正在尝试使用以下正则表达式:

preg_match("/(.*?)\\s*(\\(.*\\))*/u", $text, $matches);

但它不起作用。 如何使其有效?

2 个答案:

答案 0 :(得分:1)

如果你来自Java,你就有这个习惯来对正则表达式进行字符串化,但你应该知道PHP有这样的不同之处:你不需要。

你的正则表达式返回空结果的原因是引擎在第一步就满意了:(.*?)

您可能希望将其更改为([^(]+)(\(.*\))?,它不会使用懒惰或贪婪的点.量词(停在正确的位置)。如果abc部分始终包含单词字符[a-zA-Z0-9_],则可以使用更好的模式:(\w+)\s*(\(.*\))?

我不确定使用的u unicode修饰符。如果你真的需要它,那就添加它。

preg_match("/(\w+)\s*(\(.*\))?/", "abc (explanation)", $matches);
var_dump($matches);

输出:

array(3) {
  [0]=>
  string(17) "abc (explanation)"
  [1]=>
  string(3) "abc"
  [2]=>
  string(13) "(explanation)"
}

Live demo

答案 1 :(得分:0)

试试此代码

preg_match("/.*?\s*(\(.*?\))*$/u", $text, $matches)