preg_match_all()在不同的服务器上表现不同

时间:2012-10-06 16:04:48

标签: php regex

以下代码在我的电脑上的XAMPP上运行完美,但对我新买的VPS不起作用。它使我的代码崩溃了。

preg_match_all( "/$regex/siU" , $string , $matches , PREG_SET_ORDER );

这可以简单地从HTML中获取链接和标题。

以前,今天发生了类似的正则表达式问题。代码在本地服务器上运行正常,但在vps上创建“连接已重置”错误。这个问题是由一些评论的html(里面有php代码)引起的,它使用下面的代码来删除优化输出,但即使解决连接重置的问题,HTML仍然在浏览器源中有注释。

$string = preg_replace( '/<!--(.|\s)*?-->/' , ''    , $string );

所以,问题很明显。这些正则表达式函数不能正常工作。但我不知道解决方案。

Anyony可以帮助我解决这个问题。

解决:

感谢https://stackoverflow.com/a/12761686/369005 @vimishor

5 个答案:

答案 0 :(得分:2)

众所周知,PCRE有时会出现大于200行的文本问题。 Drupal和GeSHi的开发人员过去一直都是 hit

参考文献:

  1. Drupal PCRE Issue @ March 23, 2012
  2. GeSHi PCRE Issue @ February 02, 2012
  3. 也许如果您可以将文本拆分为小块( 100行,例如)并在每个块上运行正则表达式,可能会有所帮助。

答案 1 :(得分:1)

让我在那里停留一秒钟。使用正则表达式解析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();

答案 2 :(得分:1)

所以根本问题是应该删除HTML注释的代码不起作用?这可能是因为应该与评论匹配的正则表达式使用(.|\s)*来解决.与换行符不匹配的事实。这几乎可以保证会导致问题,正如 this answer 所解释的那样。

匹配任何内容(包括换行符)的正确方法是使用s修饰符。例如:

'/<!--.*?-->/s'

打开单行模式(也称为DOTALL模式),允许.匹配换行符。 (该另一个问题的作者必须改为使用[\S\s],因为JavaScript没有单线/ DOTALL模式的等价物。)

答案 3 :(得分:0)

看来问题是你误解了html评论的作用。根据你的问题下面的评论,问题是没有删除html注释,导致php运行错误的参数。

然而,html注释对运行或未运行的php代码没有影响,仅对浏览器显示的内容有影响(并且在javascript的情况下运行)。您的PHP代码在输出到达浏览器之前运行。

如果你想评论php代码,你需要输入/* */块或用//开始每一行。

答案 4 :(得分:-1)

试试这个:

$string = preg_replace( '/.*<!--(.|\s)*?-->.*/' , ''    , $string );

一些正则表达式实现将执行您的正则表达式:/^<!--(.|\s)*?-->$/。因此,您的表达式在不同的服务器上可能会有所不同。