0

我正在为我正在从事的项目寻找某种形式的输入安全性。基本上,如果用户输入了任何形式的 URL,我希望标记文本。

IE '欲了解更多我的照片,请访问 myhotpic.net'

因此它会检测到一个 url,然后我可以标记该字符串以通过人员进行验证。所以我需要检查任何形式的 URL。

这里有一个类似的问题 Find 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()

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

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

4

2 回答 2

2

在正则表达式中,更改{?}?. 然后它将起作用。不知道{?}应该是什么意思(我从未见过这样的事情)。

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

于 2013-07-31T21:06:43.387 回答
0

只是在这个特定问题上添加一些工作;

我采用了 OP 给出的原始 Regex 并对它进行了一些调整:这并不完美,但确实比原来的有所改进。

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

所以;

#(?<!@)(www\.|https?:\/\/)[a-z0-9-_]{2,254}\.[a-z0-9]{2,4}(\S*)#gi

例子:

看看我的脸书 www.prop-ERty-bg.ru/11be 看看我的脸书 www.property-bg.ru/11be horsae@microsoft.com

捕获两者www.property-bg.ru/11b但避免使用电子邮件地址。看到它在行动

于 2020-02-23T14:21:46.450 回答