我正在为我正在进行的项目寻找某种形式的输入安全性。 基本上我希望在用户输入任何形式的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()
为什么这不起作用?正则表达式中有错误吗?我认为它很好,因为其他用户已经取得了成功。
我似乎无法在其他任何地方为我的问题找到合适的答案。
答案 0 :(得分:1)
在正则表达式中,将{?}
更改为?
。然后它会工作。不知道{?}
应该是什么意思(我从来没有见过这样的东西)。
您的正则表达式适用于某些网址,但您应该知道网址可能比您想象的要复杂得多,并且正则表达式可以匹配每个网址非常复杂。您可能希望查找更好的正则表达式 - 您只需要一个足够复杂的处理您期望匹配的各种URL。
答案 1 :(得分:0)
只需在这个特定问题上做一点工作即可;
我按照OP给出的原始Regex进行了一些调整: 这是 NOT 的完美选择,但确实比原始版本有所改进。
@
开头的域(例如电子邮件地址){?}
http
或www
成为要求,而不是可选。 _
和-
字符(我知道这个概念总体上可以在上得到扩展。)所以;
#(?<!@)(www\.|https?:\/\/)[a-z0-9-_]{2,254}\.[a-z0-9]{2,4}(\S*)#gi
示例:
查看我的Facebook www.prop-ERty-bg.ru/11be查看我的Facebook www.property-bg.ru/11be horsae@microsoft.com
抓住两个www.property-bg.ru/11b
,但避开电子邮件地址。 See it in action。