正则表达式匹配php标签忽略xml标签

时间:2012-05-17 07:37:22

标签: regex

如果 -

,我想抛出验证错误
  • 用户输入包含php标记<?php(也适用于短标记<?
  • 但是如果没有检测到php标签,我想允许XML标签(<?xml)。
  • 在两者存在的情况下,我想抛出错误。

我现在已经达到以下正则表达式了 -

`(.*?)<\?(php)?[^xml](.*?)`

但如果输入只包含PHP短标记,则它不匹配。

我想匹配以下内容 -

PHP Short tag

<?

PHP标记

<?php

存在xml标记的PHP标记

<?php ?>
<?xml

与以下内容不匹配

<?xml

更新

如果输入仅包含(.*?)<\?[^x](.*?),则使用此正则表达式<?不会检测到<?字符,而没有任何结尾空格。我想我只需要在以下位置添加条件,只有在有更多字符的情况下才能进一步检查 -

         |
         v
`(.*?)<\?[^x](.*?)`

如果我尝试使用此功能 - (.*?)<\?([^x]?)(.*?),则不再排除xml。你看到我挂在哪里吗?我想这里有正则表达式允许的东西。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你需要正则表达式吗?为什么不这样做:

if file contains '<?php'
    throw an error
if file contains '<?' but *doesn't* contain '<?xml'
    throw an error
如评论中所述

编辑,这不会涵盖包含<?<?xml的文件(尽管您可以计算<?的出现次数如果这比<?xml的数字大,那么抛出一个错误。)

Re regex,你有几个选择。如果您的正则表达式支持负面预测,则可以查找不是后跟“x”的<?

<\?(?!x)

或者如果它不支持负向前瞻,您可以尝试

<\?([^x]|$)

其中任何一个都会寻找PHP标志的存在。

答案 1 :(得分:1)

你正在寻找的正则表达式是:

/<\?(?!xml)(?:php|.{0,3})/s

以下是PHP示例代码:

if (preg_match("/<\?(?!xml)(?:php|.{0,3})/s", $str))
  echo "Not allowed\n";

答案 2 :(得分:0)

如果您使用此正则表达式,请记住:

<\?(?!x)

<\?([^x]|$)

启用short_open_tags后,您仍然容易受到攻击。这一行将输出Hello World:

<?xml_error_string(1); echo 'Hello World!'; ?>

我只能提出这个正则表达式

<(\?([^x]|xml_.*?)|\%)

但是你仍然留下了这个片段......

error_string(1); echo 'Hello World'; ?>

我已经厌倦了一个更好的解决方案,但它仍然比运行的代码更好。 ; - )