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

时间:2014-03-05 16:01:35

标签: php preg-match-all

我花了4个多小时试图在没有运气的情况下找到我的PHP代码的正则表达式。

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

site*com
http://site*com
http://www*site*com
http://site*com/some.php
http://site*om/some.php?var1=1
http://site*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://site*com/asdad.php?var1=1&

(请注意,替换* with。我无法发布链接)

左边丢失了。

有人可以帮我添加丢失的部分吗?

非常感谢。

2 个答案:

答案 0 :(得分:4)

好。最后我明白了:

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

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

有效。

答案 1 :(得分:0)

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

$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.

您可以忽略您可能不需要的任何部分。如你所见,我正在连接它们