我正在尝试从一段字符串中提取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.com,https://www.youtube.com/watch?v=dlw32af https://instagram.com/oscar/ en.wikipedia.org“
帖子可能有逗号或可能没有逗号用于多个网址,而且字符串和网址之间可能没有任何空格,例如
sometext。http://google.com
谢谢大家:)
答案 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/
要匹配。
答案 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 )。