在1中加入3个正则表达式

时间:2011-05-13 14:50:03

标签: php regex preg-match preg-match-all

大家。 你能否就如何在1中加入以下3个正则表达式给我一些建议?

preg_match_all('/>\s*([\w-]+)\s*</', $str, $matches_1);
preg_match_all('/<\?=\s*([\w-]+)\s*\?>/', $str, $matches_2);
preg_match_all('/echo\s*["|']+\s*([\w-]+)["|']+/', $str, $matches_3);

更新

preg_match_all(
    '/
       >\s*([\w-]+)\s*<
       |
       <\?=\s*([\w-]+)\s*\?>
       |
       echo\s*("|')+\s*([\w-]+)("|')+
    /x',
    $str, $matches_123);

对我来说,上面的语法只有在一行写入并删除x修饰符时才有效。出于某种原因,不这样做会导致:

警告:preg_match_all()[function.preg-match-all]:编译失败:丢失)在偏移125处...

我已经通过将3个字符串中的正则表达式拆分并将它们连接起来解决了这个问题,但这很麻烦。

2 个答案:

答案 0 :(得分:1)

使用|

加入他们作为替代方案
preg_match_all(
    '/
       >\s*([\w-]+)\s*<
       |
       <\?=\s*([\w-]+)\s*\?>
       |
       echo\s*("|&\#039;)+\s*([\w-]+)("|&\#039;)+
    /x',
    $str, $matches_123);

您可能希望将每个部分括起来( parens ),以便在结果列表中将它们分开。但是其他子表达式可能需要?:作为前缀。替代方案["|']也是无效的(方括号不能以这种方式工作,可能会偶然起作用,但不是可靠的匹配)。

答案 1 :(得分:1)

取决于加入你的意思......你的意思是“匹配这个,否则,最后”?如果是这样的话:

/>\s*([\w-]+)\s*<|<\?=\s*([\w-]+)\s*\?>|echo\s*(?:"|')+\s*([\w-]+)(?:"|')+/