PHP preg 函数不解析 html 注释

发布于 2024-12-18 22:25:21 字数 756 浏览 0 评论 0原文

我遇到的问题仅发生在 1 台特定的 Linux 服务器上。 后面的服务器是 CentOS 5.7 Apache 2.2 PHP 5.33,仅供记录。

我有一个 PHP 模板类,它使用 preg_ 函数解析模板文件中 HTML 注释的循环。示例文件:

    <!--if place-->
        {place}
    <!--else place-->
        Nothing
    <!--endif place-->

这是我使用的命令:

$found = preg_match("/(?i)<!--(if|begin) ([a-zA-Z0-9_.\->!%<>= ]+)-->/u", $template, $aTag, PREG_OFFSET_CAPTURE, $position);

这应该给我一个名为“place”的分支。

在我的本地和所有其他环境中,它正确解析 if 分支,只有在这台服务器上,它不会解析它们,只是让它们进入代码,这意味着在我的情况下,它显示 var {place} 和字符串 Nothing。

就像我说的,它适用于本地 Windows -> WampServer 机器。它可以在其他 Linux 机器上运行,也可以在 CENTOS 机器上运行。

看起来这台机器无法将 HTML 注释标签识别为可解析的 php 脚本。这可能吗?

提前致谢。 非常感谢任何建议。

I have a problem that only occurs on 1 specific linux server.
Its a CentOS 5.7 Apache 2.2 PHP 5.33 server in the back just for the record.

I have a PHP template class that parses out loops out of HTML comments in the template files with the preg_ functions. Example file:

    <!--if place-->
        {place}
    <!--else place-->
        Nothing
    <!--endif place-->

This is the command i use:

$found = preg_match("/(?i)<!--(if|begin) ([a-zA-Z0-9_.\->!%<>= ]+)-->/u", $template, $aTag, PREG_OFFSET_CAPTURE, $position);

This should give me a branch with name "place".

On my local and all other enviroments it parses the if branch correctly, only on this sever it does not parse them and just lets them in the code which means that in my case it shows both the var {place} and the string Nothing.

Like i said, it works on local Windows -> WampServer machine. It works on other Linux machines, also CENTOS ones.

It seems like this machine is not recognizing the HTML comment tags as parsable for the php script. Is that possible?

Thanks in advance.
Any suggestions are greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不美如何 2024-12-25 22:25:21

您需要在表达式中添加“s”修饰符以强制使用多行匹配模式:

"/(?i)<!--(if|begin) ([a-zA-Z0-9_.\->!%<>= ]+)-->/s"

并且我 100% 确定您根本不需要使用“u”。

You need to add "s" modifier to your expression to force multiline matching mode:

"/(?i)<!--(if|begin) ([a-zA-Z0-9_.\->!%<>= ]+)-->/s"

and I'm 100% sure you do not need to use "u" at all.

苦笑流年记忆 2024-12-25 22:25:21

对于任何可能遇到这种情况的人。

这是一个 plesk 编译的 PHP 版本 (5.3.3),具有 2006 年的 PCRE 库!编译进去后,在解析时基本上忽略了所有的 HTML 标签!

因此,当您遇到此问题时,有些内容会被解析,而有些内容则不会,请检查 phpinfo 中的 PCRE 扩展日期。

For anybody that might come accross this also.

It was a plesk compiled PHP version (5.3.3) that had a PCRE library from 2006!! compiled into it, that basically ignored all HTML tags in parsing!

So when you have this problem, that some stuff gets parsed and some stuff not, check your phpinfo for PCRE extension date.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文