2011-03-14 159 views
2

使用以下正则表达式匹配下面的字符串,到目前为止这么好。现在,我怎么能让BAZ可选的内容,以便它匹配的情况下BAZ()php正则表达式匹配模式

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST'; 

preg_match('/FOO (\d+).+BAR (\d+).+BAZ \(\\\\(\w+)\)/i', $str, $match); 

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ() TEST'; 
$array = array(
    'FOO' => 3, 
    'BAR' => 213, 
    'BAZ' => 
); 
+0

使用运算符'?'也许?我不明白你想要什么 – 2011-03-14 22:03:17

+0

你以前的问题去了哪里? – mario 2011-03-15 03:56:39

回答

1

听起来像是你只是想整个包住在一个非捕获组中的东西,并添加一个?运算符。

/FOO (\d+).+BAR (\d+).+BAZ (?:\(\\\\(\w+)\))?/i 

请注意,这会捕获后面没有括号的BAZ。如果您正在寻找BAZ(),请使用:

/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i 
+0

谢谢,我正在寻找什么! – shareds 2011-03-14 22:08:44

1

为了使一些可选的,你可以把它放在一个非捕获组(?: ...)然后将一个问号后组。问号是一个量词,意思是“零个或一个”。

换句话说,改变这种:

\\\\(\w+) 

这样:

(?:\\\\(\w+))? 

所以整个表达式为:

/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i