出于某种原因,我无法解析这个正则表达式的正则表达式。
我从现场演示中获取代码,将其粘贴到一个新的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
我的phpinfo
:here
答案 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.
,因为塑造模具没有意义
围绕可能的编辑或某些生成的输出格式的表达式。