使用正则表达式针对PHP中未编码的字符验证编码的URI

时间:2018-08-05 03:16:37

标签: php regex validation

我使用encodeURIComponent对用户输入的URL进行编码。根据{{​​3}},它对除以下字符外的所有字符进行编码:A-Z a-z 0-9 - _ . ! ~ * ' ( )

我通过编码以下字符串对其进行了测试:

https://example.com/-._~:/?#[]@!$&'()*+,;=$%^%22{}|<>

它返回了

https%3A%2F%2Fexample.com%2F-._~%3A%2F%3F%23%5B%5D%40!%24%26'()*%2B%2C%3B%3D%24%25%5E%2522%7B%7D%7C%253C%253E

其中还包含%。我想知道它是否可以包含我错过的其他内容?

所以我想测试传递给PHP的字符串是否具有除

之外的任何未编码字符
A-Z a-z 0-9 - _ . ! ~ * ' ( ) %

我正在尝试使用documentation/^[a-zA-Z0-9%.-_~!'()*]+$/g进行测试,但是它传递了诸如abc;<>之类的字符串。这里是preg_match。我在做什么错了?

仅需注意,我不是在尝试验证URL的格式,只是为了查看用户是否不是试图在javascript验证器周围插入任何有趣的东西,或者查看javascript验证器是否未损坏。这是我要为系统辩护的草图:

regex101

2 个答案:

答案 0 :(得分:1)

问题出在正则表达式中,您有.-_,它被解释为.(字符46)和_(字符95)之间的任何字符。您可以在regex101链接的说明中看到这一点。其中包括<>字符,这就是您的模式匹配的原因。要对其进行修复,请在\前面添加一个-,以确保将其视为文字-,即将正则表达式更改为

^[a-zA-Z0-9%.\-_~!'()*]+$

答案 1 :(得分:0)

encodeURIComponent()对所有非字母数字字符进行编码。另外一个encodeURI()不对特殊字符进行编码,而是将空格转换为%20

encodeURI()设计用于完整的URI,而encodeURIComponent()设计用于URI的一部分。

我始终使用encodeURIComponent()作为该值,以确保我的AJAX请求中的数据安全。