PHP在字符串中以任何形式查找URL

时间:2013-07-31 20:53:11

标签: php regex

我正在为我正在进行的项目寻找某种形式的输入安全性。 基本上我希望在用户输入任何形式的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()

返回

为什么这不起作用?正则表达式中有错误吗?我认为它很好,因为其他用户已经取得了成功。

我似乎无法在其他任何地方为我的问题找到合适的答案。

2 个答案:

答案 0 :(得分:1)

在正则表达式中,将{?}更改为?。然后它会工作。不知道{?}应该是什么意思(我从来没有见过这样的东西)。

您的正则表达式适用于某些网址,但您应该知道网址可能比您想象的要复杂得多,并且正则表达式可以匹配每个网址非常复杂。您可能希望查找更好的正则表达式 - 您只需要一个足够复杂的处理您期望匹配的各种URL。

答案 1 :(得分:0)

只需在这个特定问题上做一点工作即可;

我按照OP给出的原始Regex进行了一些调整: 这是 NOT 的完美选择,但确实比原始版本有所改进。

  • 添加了预先确定的避免行为,以避免以@开头的域(例如电子邮件地址)
  • 删除了不正确的{?}
  • 使httpwww成为要求,而不是可选。
  • 在接受的URL字符集中添加了_-字符(我知道这个概念总体上可以在上得到扩展。)

所以;

#(?<!@)(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