Php preg_match_all()在不同服务器上的行为不同
下面的代码在我的PC上的XAMPP上运行得很好,但在我新买的VPS上不起作用。它毁了我的代码Php preg_match_all()在不同服务器上的行为不同,php,regex,Php,Regex,下面的代码在我的PC上的XAMPP上运行得很好,但在我新买的VPS上不起作用。它毁了我的代码 preg_match_all( "/$regex/siU" , $string , $matches , PREG_SET_ORDER ); 这只需要从HTML获取链接和标题 以前,今天也发生了类似的正则表达式问题。代码在本地服务器上运行正常,但在vps上创建“连接已重置”错误。这个问题是由一些已注释的html(其中包含php代码)引起的,这些html使用下面的代码来优化输出,但即使连接重置问题得到解
preg_match_all( "/$regex/siU" , $string , $matches , PREG_SET_ORDER );
这只需要从HTML获取链接和标题
以前,今天也发生了类似的正则表达式问题。代码在本地服务器上运行正常,但在vps上创建“连接已重置”错误。这个问题是由一些已注释的html(其中包含php代码)引起的,这些html使用下面的代码来优化输出,但即使连接重置问题得到解决,html仍然在浏览器源代码中包含注释
$string = preg_replace( '/<!--(.|\s)*?-->/' , '' , $string );
$string=preg_replace('//','$string);
所以,问题很清楚。这些正则表达式函数工作不正常。但我不知道解决办法
我能帮我解决这个问题吗
已解决:
多亏了@vimishor试试这个:
$string = preg_replace( '/.*<!--(.|\s)*?-->.*/' , '' , $string );
$string=preg_replace('/.*.*/',''.$string);
一些正则表达式实现将像这样执行正则表达式:
/^$/
。因此,您的表达式在不同的服务器上的行为可能会有所不同。众所周知,PCRE有时会遇到一些大于200行的文本问题。Drupal和GeSHi的开发人员在过去曾遇到过这个问题
参考资料:
如果您可以将文本分成小块(例如100行)并在每个块上运行regex,可能会有所帮助。让我在这里停一下。用正则表达式解析HTML是个坏主意,除非这是一个关于格式错误文档的非常孤立的问题。您需要使用适当的解析器;例如,下面是一个剥离HTML注释的示例:
$html = <<<EOM
<html>
<body>
<div id="test">
<!--
comment here
-->
</div>
</body>
</html>
EOM;
$d = new DOMDocument;
$d->loadHTML($html);
$x = new DOMXPath($d);
foreach ($x->query('//comment()') as $node) {
$node->parentNode->removeChild($node);
}
echo $d->saveHTML();
$html=问题似乎在于您误解了html注释的作用。根据问题下方的注释,问题在于html注释没有被删除,导致php使用错误的参数运行
但是,html注释对运行或未运行的php代码没有影响,只影响浏览器显示的内容(在javascript情况下运行)。php代码在输出到达浏览器之前运行
如果你想注释掉php代码,你需要插入一个/***/
块,或者以/
开始每一行,所以根本问题是用来删除HTML注释的代码不起作用?这可能是因为应该匹配注释的正则表达式使用(.|\s)*
来解决
与换行符不匹配的问题。正如所解释的,这几乎肯定会导致问题
匹配任何内容(包括换行符)的正确方法是使用s
修饰符。例如:
'/<!--.*?-->/s'
“//s”
这将打开单行模式(也称为DOTALL模式),允许
匹配换行符。(另一个问题的作者不得不改用[\S\S]
,因为JavaScript对于单行/DOTALL模式没有等价物。)phpinfo()显示Configure命令'--with pcre regex=/opt/pcre',因此安装了pcre。它与服务器日志有任何关系吗?Configure命令与此没有什么关系;你需要找出为什么这些过程正在消亡。。您的pcre似乎存在一些链接问题。Apache错误日志文件为空。看到使用vim error\u登录/var/log/httpd/只需再次阅读问题,我可能误解了;发生“连接重置”是因为正则表达式没有正确应用?您正在对服务器上实际运行的HTML执行regexp?!如果使用matches()
方法,则仅使用Java。PCRE没有。好吧,让我试试。我将很快回复结果。在应用正则表达式之前添加了此代码。还是没什么$string=str_replace(数组(“\r”,“\n”),“,$string);您将Mac样式的行尾替换为Unix样式的行尾。我的建议是只选择文本的前100行,并仅在这些行上运行regex;重复此过程,直到完成整个文本。上面的示例用空格替换mac和unix样式的新行。这就解决了问题。你是对的。问题在于上述PCRE问题。谢谢你的回答。啊,你说得对。我错过了str\u replace
中的array()。对不起。我很高兴你解决了这个问题。向你问好,也许我没能解释清楚。让我们再试一次。假设注释上面的第二个正则表达式函数应该删除包含php代码的注释。但是,在VPS上,它并没有做它本来应该做的事情。保留注释和php代码不变。现在,假设代码调用的函数没有在任何地方声明(从包含的函数中删除)。php代码并不是为了参考而删除的,也不是为了让我看到脚本在过去的样子。而且也没有安全风险,因为它不会执行。@Hamid Sarfraz如果你用正则表达式解析php脚本,你是对的,我的答案不适用。我假设您正在解析html页面。很好的示例。但是,即使我实现了这段代码,问题仍然存在。问题出在所有PCRE函数上。@HamidSarfraz您还没有给出一个例子,说明它在两台服务器上的输入、表达式和输出会产生不同的结果。好的,这将花费很长的时间,因此我将用我认为有用的所有细节回答下面的问题。请稍等,谢谢,杰克。问题已经解决了。谢谢合作。请继续帮助别人,特别是像我这样的新人。