用于从字符串中提取所有URL的正则表达式,用于终止字符串的句点

时间:2018-01-16 09:38:51

标签: php regex string

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

尝试过模式

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

CODE

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.comhttps://www.youtube.com/watch?v=dlw32af   https://instagram.com/oscar/ en.wikipedia.org“

帖子可能有逗号或可能没有逗号用于多个网址,而且字符串和网址之间可能没有任何空格,例如

  

sometext。http://google.com

regexDemo

谢谢大家:)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您的初始问题中,您没有指定每个&#34;字&#34; (URL的一部分)可以包含字母以外的内容。 请注意,您的正则表达式包含[a-z],表明您 想要只匹配网址,其中包含&#34;字&#34;组成完全 字母,没有任何数字,减去字符或下划线。

尝试以下正则表达式:

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

说明

  • (?:https?:\/\/)? - 可选的协议名称。
  • (?i) - 启用不区分大小写的选项。
  • [a-z][a-z0-9_-]* - 第一个&#34;字&#34;的URL(第一个字母,  然后任意数量的字母,数字,下划线或减号()。
  • (?:[.\/] - 非捕获组:点或斜线。
  • (?!http) - 然后是负面预测,以阻止从URL开始的情况 http 后面紧跟一个点(或斜杠)。
  • [a-z0-9_-]+)+ - 然后是下一个&#34;字&#34; (可选,无需启动 从一封信),所有这些(非捕获组)重复。
  • \/? - 可选斜杠,在查询字符串(如果有)之前终止该部分。
  • (?:\?[^\s,.]+)? - 查询字符串的可选非捕获组。 它从?开始,然后是除空格之外的一系列字符, 逗号或点。

上面的正则表达式与尾随点不匹配,正如您所希望的那样。

注意:

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

根据您的评论,我更改了正则表达式,即&#34; word&#34;也可以包含 数字,下划线和减号。

另请注意-作为第一个最后字符[...]之间的字符集 对于它自己(与另外两个字符之间的-相对,这意味着它 from - to )。