2011-05-13 61 views
1

everyone。 你能给我一些关于如何在1中加入以下3个正则表达式的建议吗?加入3个正则表达式1

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); 

UPDATE

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

对我来说,语法,如果写在一行,并移除X-修改以上才有效。出于某种原因,不这样做的原因:

警告:preg_match_all()[function.preg匹配-所有]:编译失败:丢失),偏移量125 ...

我已经解决了它只是在3个字符串中拆分正则表达式并将它们连接起来,但它是一团糟。

+1

有一个问题:它工作吗?如果是这样,为什么修理没有损坏的东西? – mellamokb 2011-05-13 15:04:58

+1

@mellamokb它的工作原理。但是,考虑你有一个非常大的字符串,你需要应用正则表达式。有了上面的代码,你需要解析这个大字符串三次,我认为这不是一个好习惯。 – noname 2011-05-13 19:14:12

+0

正如@AlanMoore在下面写的那样,这个特殊的3行/ x正则表达式只能和每个'#'都转义成'\#'一起使用。但是,当然,再次压缩它的效果是一样的。 – mario 2011-05-15 15:28:35

回答

1

使用|

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

你可能想每个部分封装成(括号),让他们在结果列表分开加入他们作为替代品。但是其他子表达式可能需要是前缀?:["|']也是无效的(方括号不以这种方式工作,可能会意外运行,但不是可靠的匹配)。

+0

谢谢,但在我的情况下,方括号确实按我需要的方式工作。你也应该在结束报价前加上'x'。 – noname 2011-05-13 19:28:19

+0

@noname所以最后一个正则表达式真的应该匹配'echo&; abc |#' - 因为这就是你的角色类所做的。 – mario 2011-05-13 20:56:30

+0

是的,你说得对,它是无效的。我遵循你的建议。看到我的问题更新,PLZ。 – noname 2011-05-15 13:44:45

1

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

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

谢谢,工作正如预期的那样 – noname 2011-05-13 19:11:20

+1

您需要更改'[" | '] ''到'(?:" | ')';这是原始正则表达式中的错误 – 2011-05-15 14:19:45

+0

@Alan:的确,我没有注意到它 - 谢谢! – 2011-05-15 14:55:08