使用块限制检查字符串语法

时间:2012-01-05 18:45:01

标签: php regex preg-match

我需要制作一个正则表达式来验证外部字符串。我正在构建一个PHP FW,它有一个load()函数。它从views/目录加载一个视图,有时我需要从用户那里收到一个外部字符串,这是不安全的。

目前我的正则表达式是:~^([a-z_0-9A-Z\x7f-\xff]*/?)+$~并且它可以验证,例如:

  • hello:true
  • hello/world:true
  • hello/world/:true
  • ../pass:false

所以,它非常好用。但是如果我从用户那里收到一个外部字符串,例如:"hello/{$world}"他可以发送$world = "sub/dir",在某些情况下它是非常不安全的。我想通过使用一个特殊字符来限制它(也可以通过另一个函数来完成,测试它,但我也想要内联,因为它更简单)。

我想要制作一个“限制块”,如:"hello/[{$world}]"这意味着我在colchetes之间的所有东西都没有斜线,例如基于:

  • hello/world:true
  • hello/world/test:false

那么,我需要改变我的正则表达式呢?

修改

问题是:我需要匹配一个字符串,例如:

function load($path) {
    if(preg_match($path,...))
        include ...;
}

如果$pathabc/def/ghiabc/[def]/ghi,则可以,但如果abc/[def/ghi]它会失败,因为我无法/内{ {1}}。

更多信息

  • [block limitator]:true
  • [$test] => hello:false
  • [$test] => hello/world:true
  • [$a]/[$b] => hello/world:false(也需要$ b)
  • [$a]/[$b] => hello:不可能,假

我将解析结果以删除块限制后,我只需要检查它是否有效。

1 个答案:

答案 0 :(得分:1)

如果理解正确,可能是这样的

展开:

^
  ( [a-z_0-9A-Z\x7f-\xff]* /?
    |
    \[ [a-z_0-9A-Z\x7f-\xff]* \] (?=/|$) /?
  )+
$

修改

或更多因素:

^
  ( 
    (?:  [a-z_0-9A-Z\x7f-\xff]*
       | \[ [a-z_0-9A-Z\x7f-\xff]* \] (?=/|$)
    )
    /?
  )+
$

如果你不介意额外的unicode字符:

~^(?:(?:[\w\x7f-\xff]*|\[[\w\x7f-\xff]*\](?=/|$))/?)+$~

edit2 剔除最后一点因子:

~^(?:(?:[a-z_0-9A-Z\x7f-\xff]*|\[[a-z_0-9A-Z\x7f-\xff]*\])(?=/|$)/?)+$~

~^(?:(?:[\w\x7f-\xff]*|\[[\w\x7f-\xff]*\])(?=/|$)/?)+$~

请记住,空字符串,甚至///和此正则表达式都匹配。