3

我有一个接受来自 PHP 用户的 URL 的表单。

我应该允许或禁止哪些字符?目前我使用

$input= preg_replace("/[^a-zA-Z0-9-\?:#.()\,/\&\'\\"]/", "", $string);

$input=substr($input,0,255);

因此,它被修剪为 255 个字符,并且只能包含字母、数字和 ? - _ : # ( ) , & '" /

我应该剥离的任何我不是的东西,或者我剥离的任何可能需要在有效 URL 中的东西?

4

4 回答 4

6

定义 URL 规范的RFC 1738规定只有字符

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-

可以在 URL 方案中使用,并且只有字符

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*'(),;/?:@=&

可以在 URL 的特定于方案的部分中未编码地使用。( ;/?:@=&,如果使用未编码,则必须用于其“保留目的”,但如果您只是检查无效字符,则无需担心)。因此,如果您想要完整的通用性,我会根据这个正则表达式检查 URL:

"/([a-zA-Z+.-]+:\/\/)?([a-zA-Z0-9\$\-_\.\+\!\*'\(\),\;\/\?\:\@\=\&]+)/"

(可能其中一些转义是不必要的)。如果您只是在寻找 HTTP URL,(其中一些)其他答案应该没问题。

于 2009-02-15T00:40:38.000 回答
3

对于 %20 之类的内容,您需要允许 = 符号和 %。@ 符号也是合法的

您可以使用这样的正则表达式验证 url

/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

另外我认为网址中也不允许使用括号和引号。

于 2009-02-14T23:48:56.953 回答
2

我建议您根据规范解析 URI(对非法字符有点宽容),然后严格按照规范重建它......这听起来很多,但我已经开始使用我编写和使用的类对于我自己的项目。

我把它放在pastebin上,因为它相当大。

例子:

$uri = new N_Uri('http://example.com/path/segments/with spaces?key=value');
回声$uri;

打印出来:http ://example.com/path/segments/with%20spaces?key=value

于 2009-02-15T00:56:10.503 回答
0

这是我在我制作的 TinyUrl 克隆网站上使用的正则表达式:

([a-zA-Z]+://)?([a-z0-9A-Z-]+\.[a-z0-9A-Z\.-]+[a-z0-9A-Z/_?=;%&,+\.\-]+)
于 2009-02-14T23:57:17.947 回答