PHP - 无法使正则表达式工作

时间:2016-08-14 17:29:55

标签: php regex

出于某种原因,我无法解析这个正则表达式的正则表达式。

我从现场演示中获取代码,将其粘贴到一个新的PHP文件中,保存并在我的服务器中运行。

有人知道它为什么不起作用,可以解释为什么吗? 它实际上是相同的代码。 :\

$str = <<< STR
    sbmt_btn.hide();
    $(this).load(urlStr, data, function (response, innerstatus, xhr) {
        status = innerstatus;
        pb.hide();
        sbmt_btn.show();
        if (status == "error") {
            var msg = "Sorry but there was an error: ";
            $(this).html(msg + xhr.status + " " + xhr.statusText);
        }
        if ($('#NoMoreSearchForYou').get(0)) {
            $('.ui-dialog-buttonset').hide();
        }
        else if ($('#MoreSearchForYou').length > 0) {
            $('.ui-dialog-buttonset').show();
        }
        else {
            $('.ui-dialog-buttonset').hide();
        }
    });
},
STR;

preg_match('~\$\(this.+[\s\S]*hide\(\);[\s\S]{49};~', $str, $matches);
var_dump($matches[0]);

适用的原始代码:live demo

错误显示在图片中:

here http://image.prntscr.com/image/d498412b29e8480db33bf30f68888dfb.png

我的phpinfohere

2 个答案:

答案 0 :(得分:1)

您需要转义正则表达式的反斜杠,例如\s,因为它在字符串中不会正确显示。所以它应该是\\s

preg_match('~\$\(this.+[\\s\\S]*hide\(\);[\\s\\S]{49};~', $str, $matches);

而且,我认为既然你知道了字符末尾部分的固定长度,那就意味着你知道要抓住什么东西,这可能是更简单的。

preg_match('~\$\(this[\\s\\S]+hide\(\);[\\s\\S]+\}\);~', $str, $matches);

答案 1 :(得分:1)

您遇到的问题是您最后有一个固定的宽度要求。

\(\) [\ s \ S] {49} ;之间

这绝不是一个好主意,特别是如果[\S\s]跨越行 你永远不知道一些网站测试人员如何处理CRLF翻译,所以不要这样做。

一个简单的测试就会证明这一点。使用捕获组,并将其更改为
使用我们得到的变量贪心量词\(\)([\s\S]+);

 **  Grp 1 -  ( pos 895 , len 51 ) 

                        }
                    })  

这是CRLF行翻译。

如果我们转 OFF 翻译(现在只有LF&#39;),我们会得到:

 **  Grp 1 -  ( pos 878 , len 49 ) 

                        }
                    })  

还有你的49

结论&nbsp;:

将其更改为
1. \$\(this.+[\s\S]*hide\(\);[\s\S]+;

2. \$\(this.+[\s\S]*hide\(\);[\s\S]{49,51};

最好使用1.,因为塑造模具没有意义 围绕可能的编辑或某些生成的输出格式的表达式。