以下代码在我的电脑上的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
答案 0 :(得分:2)
众所周知,PCRE有时会出现大于200行的文本问题。 Drupal和GeSHi的开发人员过去一直都是 hit 。
参考文献:
也许如果您可以将文本拆分为小块( 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)*?-->$/
。因此,您的表达式在不同的服务器上可能会有所不同。