preg_match_all – регулярное выражение для поиска полных URL-адресов в строке

Я потратил более 4 часов, пытаясь найти регулярное выражение для моего php-кода без везения.

У меня есть строка с html-кодом. В нем много форматов URL-адресов:

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); 

Единственное, что мне нужно, это ТАКЖЕ убрать URL-адреса с несколькими строками запросов, используя «&» Я получаю их, но не полностью, я получаю такие вещи, как:

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

(обратите внимание, замените * на. я не могу писать сообщения)

Левые потеряны.

Может кто-нибудь помочь мне добавить часть, потерянную в шаблон?

Большое спасибо заранее.

Что ж. Наконец то я понял:

Последний код регулярного выражения:

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

Оно работает.

Проверьте этот шаблон, который можно использовать для любого типа URL

 $regex = "((https?|ftp)\:\/\/)?"; // Checking scheme $regex .= "([a-z0-9-.]*)\.([az]{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. 

Вы можете игнорировать любой раздел, который вам может не понадобиться. Как вы видите, я их конкатенирую