【问题标题】:regex for extracting all urls from string excluding period for terminating strings用于从字符串中提取所有 url 的正则表达式,不包括用于终止字符串的句点
【发布时间】:2018-01-16 09:38:50
【问题描述】:

我正在尝试从一段字符串中提取 URL 我有不同的帖子在他们的消息中包含 URL。我已经准备了一个匹配的模式,但它不能正常工作。我问过同样的问题here,但忘了在其中添加这个案例,所以我要问一个新问题。

尝试过的模式

\b(\.?)(?:https?://)?(?:(?i:[a-z]+\.)+)[^\s,]+\b

代码

for ( $i = 0; $i < $resultcount; $i ++ ) {
    $pattern = '%\b(\.?)(?:https?://)?(?:(?i:[a-z]+\.)+)[^\s,]+\b%';
    $message = (string)$result[$i]['message'];
    preg_match_all($pattern,$message,$match);
    print_r($match);
    }

这样的帖子示例

“这只是一个测试正则表达式提取 URL 的帖子。 http://google.com, https://www.youtube.com/watch?v=dlw32af https://instagram.com/oscar/en.wikipedia.org"

对于多个 URL,Post 可能有逗号,也可能没有逗号,而且字符串和 url 之间可能没有任何空格,例如

sometext.http://google.com

regexDemo

谢谢大家:)

【问题讨论】:

    标签: php regex string


    【解决方案1】:

    这将匹配经过精确编码并具有 HTTP URL 等格式的字符串,但属于 IDN 分类的字符串除外:

    (?i)(?:https?://[^"'\s<>(){}]++|[a-z0-9](?<=\b.)[a-z0-9-]*+(?:\.[a-z-]{2,}+)++(?=[/?"'()\s]|:\d++|\Z)[^"'\s<>(){}]*+)
    

    所以你不会期待

    ftp://username:password@ftpserver/folder/ 
    

    待匹配。

    Live demo

    【讨论】:

      【解决方案2】:

      在您最初的问题中,您没有指定每个“单词” (URL 的一部分)可以包含字母以外的内容。 请注意,您的正则表达式包含 [a-z],这表明您 只想匹配由完全组成的“单词”的 URL 字母,没有任何数字,减号或下划线。

      试试下面的正则表达式:

      (?:https?:\/\/)?(?i)[a-z][a-z0-9_-]*(?:[.\/](?!http)[a-z0-9_-]+)+\/?(?:\?[^\s,.]+)?
      

      说明:

      • (?:https?:\/\/)? - 可选协议名称。
      • (?i) - 打开 不区分大小写 选项。
      • [a-z][a-z0-9_-]* - URL 的第一个“单词”(第一个字母, 然后是任意数量的字母、数字、下划线或减号字符)。
      • (?:[.\/] - 非捕获组:点或斜线。
      • (?!http) - 然后是负前瞻,以阻止 URL 从 http 前面紧跟一个点(或斜杠)。
      • [a-z0-9_-]+)+ - 然后是下一个“单词”(可选,不需要开始 来自一封信),所有这些(非捕获组)都重复了。
      • \/? - 可选斜杠,在查询字符串之前终止部分(如果有)。
      • (?:\?[^\s,.]+)? - 查询字符串的可选非捕获组。 它从? 开始,然后是空格以外的一系列字符, 逗号或点。

      如您所愿,上述正则表达式与尾随点不匹配。

      注意:

      当我在 regex101.com 下尝试这个正则表达式时,我引用了 / 包含的字符 在里面。您可能可以省略此引用。

      根据您的评论,我更改了正则表达式,“单词”也可以包含 数字、下划线和减号。

      还要注意- 作为[...] 之间的first 或last 字符代表 为自己(与其他两个字符之间的-相反,这意味着 从 - 到)。

      【讨论】:

      • 请提供示例源字符串并描述问题所在。
      • 我刚刚添加了 negative lookahead,这应该会让事情正确。
      • 工作正常,但我能够正确获取 url 查看演示:regex101.com/r/zueqmp/3
      猜你喜欢
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2011-07-24
      • 1970-01-01
      • 2014-08-25
      相关资源
      最近更新 更多