4

以下代码在我的 PC 上的 XAMPP 上完美运行,但不适用于我新购买的 VPS。它使我的代码崩溃了。

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

这应该只是从 HTML 中获取链接和标题。

以前,今天发生了类似的正则表达式问题。代码在本地服务器上运行良好,但在 vps 上创建“连接被重置”错误。该问题是由使用以下代码删除的一些注释 html(其中包含 php 代码)引起的,以优化输出,但即使连接重置问题得到解决,HTML 在浏览器源代码中仍然有注释。

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

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

任何人都可以帮我解决这个问题。

解决了:

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

4

5 回答 5

2

众所周知,PCRE 有时对大于 200 行的文本有一些问题。Drupal 和 GeSHi 的开发人员过去曾遇到过这个问题。

参考:

  1. Drupal PCRE 问题@ 2012 年 3 月 23 日
  2. GeSHi PCRE 问题@2012 年2 月2 日

也许如果您可以将文本分成小块(例如 100 行)并在每个块上运行正则表达式,可能会有所帮助。

于 2012-10-06T16:42:28.900 回答
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();
于 2012-10-06T16:46:57.717 回答
1

所以根本问题是应该删除 HTML 注释的代码不起作用?这可能是因为应该与注释匹配的正则表达式用于解决不匹配换行符(.|\s)*的事实。正如这个答案所解释.的,这几乎肯定会导致问题。

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

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

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

于 2012-10-07T06:41:15.573 回答
0

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

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

如果你想注释掉 php 代码,你需要在一个/* */块中或者每一行以//.

于 2012-10-06T16:50:53.870 回答
-1

试试这个:

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

一些正则表达式实现会像这样执行你的正则表达式/^<!--(.|\s)*?-->$/:所以你的表情在不同的服务器上可能表现不同。

于 2012-10-06T16:13:28.097 回答