我需要制作一个正则表达式来验证外部字符串。我正在构建一个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 ...;
}
如果$path
为abc/def/ghi
或abc/[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
:不可能,假我将解析结果以删除块限制后,我只需要检查它是否有效。
答案 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]*\])(?=/|$)/?)+$~
请记住,空字符串,甚至///
和此正则表达式都匹配。