2012-08-09 53 views
0

我想从正则表达式中取出所有字符。正则表达式,问题组

$str = "html code <script> var='a,b,c,d,e,f,g,h' </sript> html code"; 
preg_match_all ('#var =.((\w),?)+.#',$str,$m); 
echo "<pre>"; 
print_r ($ m); 
echo "</ pre>"; 

结果:

Array 
(
    [0] => Array 
     (
      [0] => var = 'a, b, c, d, e, f, g, h' 
     ) 

    [1] => Array 
     (
      [0] => h 
     ) 

    [2] => Array 
     (
      [0] => h 
     ) 

) 

^h - 最后搜寻股票,为什么呢?

+1

所有当代引擎中的正则表达式都超过“常规”:后向引用不包含在(纯)常规语言中。因此更新了标签。 – Richard 2012-08-09 09:55:35

回答

0

因为您在组之后多次重复使用组+。这样,该组每次都匹配,直到h,最后一次匹配,表达完成。

如果您希望每个比赛都在一个组中,那么您必须事后拆分完整比赛或为自己创建每个组。

+0

var =。((\ w),?(\ w),?(\ w),?(\ w),?(\ w),?(\ w),?(\ w),?)。这样做? – Opalosolo 2012-08-09 10:00:18

0

我认为你正在尝试做一些不太适合正则表达式的东西 - 尽管有时它们是工作的最佳工具,但它们仅限于匹配可​​以用某种方式描述的模式。他们没有控制逻辑,所以不能循环或递归。用正则表达式和其他方法来达到你想要的效果是很好的。

在这种情况下,我会使用正则表达式(的preg_match - 不preg_match_all)来匹配var='...'这样你就可以提取...,然后通过逗号分割字符串,分隔每个项到一个数组。

如果您尝试弯曲正则表达式来完成所有操作,那么效率就会低得多,而且可靠性也会降低(因为在这种情况下很难写出坚如磐石的正则表达式)。