【发布时间】:2013-08-01 14:12:20
【问题描述】:
我正在为我正在从事的项目寻找某种形式的输入安全性。 基本上,如果用户输入了任何形式的 URL,我希望标记文本。
IE '欲了解更多我的照片,请访问 myhotpic.net'
因此它会检测到一个 url,然后我可以标记该字符串以通过人员进行验证。 所以我需要检查任何形式的 URL。
这里有一个类似的问题 Finding urls from text string via php and regex? 有一个答案。但是我已经用各种字符串厌倦了这个,我没有得到预期的结果。
例如
$pattern = '#(www\.|https?:\/\/){?}[a-zA-Z0-9]{2,254}\.[a-zA-Z0-9]{2,4}(\S*)#i';
$count = preg_match_all($pattern, 'http://www.Imaurl.com', $matches, PREG_PATTERN_ORDER);
将匹配项返回为
array(3) {
[0]=>
array(0) {
}
[1]=>
array(0) {
}
[2]=>
array(0) {
}
}
并且通过preg_last_error()没有返回错误
为什么这不起作用?正则表达式是否有错误?我认为它没问题,因为其他用户已经成功了。
我似乎无法在其他任何地方找到适合我的问题的答案。
【问题讨论】:
-
将
{?}变成?,它似乎工作正常。不知道{?}应该做什么;我从来没有见过这样的事情。 -
我只是寻找“www”、“http”、任何东西。[az]{2,3} 等。如果只想检测 url 而不需要实际提取它,这应该可以正常工作。
-
@mightypork 如果其中一个字符串包含谈论 HTTP 协议的文本怎么办?还是
www用来代表笑声?我不确定这么简单是最好的方法。使用完整的正则表达式没有任何问题;这个不是很复杂。 -
我认为您需要更好地定义构成 URL 的内容。在您的情况下,它似乎是 www.somedomain.tld 或 http(s)://somedomain.tld 的形式。 http(s)://www.somedomain.tld 呢? http(s)://subdomina.domain.tld 呢? subdomain.domain.tld 呢?主机名而不是域的 IP 地址呢?除了http之外的其他协议呢?非标准端口呢?如果您只想标记可链接的 URL,也许您只需要搜索
://,否则还有很多其他组合您没有考虑过。