【问题标题】:PHP Find a URL in any form within a stringPHP 在字符串中查找任意形式的 URL
【发布时间】: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,也许您只需要搜索 ://,否则还有很多其他组合您没有考虑过。

标签: php regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我采用了 OP 给出的原始正则表达式并对其进行了一些调整: 这完美,但确实比原版有所改进。

    • 添加了 netagive 前瞻以避免以 @ 开头的域(例如电子邮件地址)
    • 删除了不正确的{?}
    • 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

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2021-01-16
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多