preg_match_all-用于查找字符串中完整URL的正则表达式

问题描述 投票:4回答:2

我花了4个多小时试图找到我的php代码的正则表达式,但是没有运气。

我有一个带html代码的字符串。它具有许多网址格式,例如:

example.com
http://example.com
http://www.example.com
http://example.com/some.php
http://example.com/some.php?var1=1
http://example.com/some.php?var1=1&var2=2
etc.

我有以下php代码部分起作用:

preg_match_all('/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $content, $result, PREG_PATTERN_ORDER);

[我唯一需要做的是还使用“&”捕获具有多个查询字符串的网址我得到它们,但不完整,我只收到类似以下内容:

http://example.com/asdad.php?var1=1&

左边丢了。

有人可以帮助我将丢失的部分添加到图案中吗?

非常感谢。

php preg-match-all
2个回答
4
投票

嗯。终于我明白了:

最终的正则表达式代码为:

$regex = "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i";

有效。


0
投票

检查这些可用于任何URL类型的模式

$regex = "((https?|ftp)\:\/\/)?"; // Checking scheme 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Checking host name and/or IP
$regex .= "(\:[0-9]{2,5})?"; // Check it it has port number
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // The real path
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // Check the query string params
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Check anchors if are used.

您可以忽略任何不需要的部分。如您所见,我正在串联它们

© www.soinside.com 2019 - 2024. All rights reserved.