连续标签上的php preg_match

时间:2014-01-23 00:21:17

标签: php regex preg-match

我正在尝试捕获apache conf文件中的所有位置路径,以生成自动nginx模板。

我正在阅读的文件有这样的内容

<Location /images/mobile>
    SetHandler modperl
    PerlOutputFilterHandler Apache2::AMFImageRendering
</Location>
<Location /images/otherroute>
    SetHandler modperl
    PerlOutputFilterHandler Apache2::AMFImageRendering
</Location>

我几乎让正则表达式与“位置”匹配组一起工作,我有以下

$file_str = file_get_contents($conf);
preg_match("/<Location\s+(?P<location>.*?)\s*>.*?Apache2::AMFImageRendering.*?<\/Location>/s", $file_str, $matches);
print_r($matches);

问题是这只能获得$ match ['location']内的第一个位置“/ images / mobile”

无论如何都要匹配所有位置,不分割字符串或使用带偏移量的preg_match

谢谢

1 个答案:

答案 0 :(得分:1)

您正在寻找preg_match_all()。这是PHP对普通正则表达式的/g修饰符的回答。传递的第3个参数($matches)现在将包含一组全局匹配集。

$file_str = file_get_contents($conf);
preg_match_all("/<Location\s+(?P<location>.*?)\s*>.*?Apache2::AMFImageRendering.*?<\/Location>/s", $file_str, $matches);

print_r($matches);
// Array (
//   [0] => Array
//     (
//       [0] => SetHandler modperl PerlOutputFilterHandler Apache2::AMFImageRendering
//       [1] => SetHandler modperl PerlOutputFilterHandler Apache2::AMFImageRendering
//     )
//   [location] => Array 
//     (
//       [0] => /images/mobile
//       [1] => /images/otherroute
//     )
//   [1] => Array
//     (
//       [0] => /images/mobile
//       [1] => /images/otherroute
//     )
//  )