Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match_all()在不同服务器上的行为不同_Php_Regex - Fatal编程技术网

Php preg_match_all()在不同服务器上的行为不同

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使用下面的代码来优化输出,但即使连接重置问题得到解

下面的代码在我的PC上的XAMPP上运行得很好,但在我新买的VPS上不起作用。它毁了我的代码

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您还没有给出一个例子,说明它在两台服务器上的输入、表达式和输出会产生不同的结果。好的,这将花费很长的时间,因此我将用我认为有用的所有细节回答下面的问题。请稍等,谢谢,杰克。问题已经解决了。谢谢合作。请继续帮助别人,特别是像我这样的新人。