сопоставить шаблон url в php с использованием регулярного выражения

Я хочу сопоставить ссылку url на стене и заменить эту ссылку тегом anchor, для этого я использую регулярное выражение ниже.

Мне хотелось бы совпадение с 4 типами URL:

  1. http://example.com
  2. https://example.com
  3. www.example.com
  4. example.com
 preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $subject); 

Это выражение соответствует только первым двум типам URL-адреса.

Если я использую это выражение для соответствия шаблону url '@(www?([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@' , то он соответствует только типу url-шаблона третьего типа.

Как я могу сопоставить все четыре типа шаблона url с одним регулярным выражением?

Related of "сопоставить шаблон url в php с использованием регулярного выражения"

Честно говоря, я бы использовал другое регулярное выражение. Как и тот, который Грубер опубликовал в 2009 году:

 \b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))) 

или эта обновленная версия, которую Gruber опубликовал в 2010 году (спасибо, @IMSoP):

 (?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''])) 

Полный рабочий пример с использованием ссылки Nev Stokes :

 public function clickableUrls($html){ return $result = preg_replace( '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s', '<a href="$1">$1</a>', $html ); } 

Я огляделся и не видел, что это именно то, что мне нужно. Я нашел этот, который был близок, поэтому я изменил его следующим образом:

 ^((([hH][tT][tT][pP][sS]?)\:\/\/)?([\w\\-]+(\[\w\.\&%\$\-]+)*)?((([^\s\(\)\<\>\\\"\.\ [\]\,;:]+)(\.[^\s\(\)\<\>\\\"\.\[\]\,;:]+)*(\.[a-zA-Z]{2,4}))|((([01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])))(\b\:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)\b)?((\/[^\/][\w\.\,\?\'\\\/\+&%\$#\=~_\-]*)*[^\.\,\?\"\'\(\)\[\]!;<>{}\s\x7F-\xFF])?)$ 

проверьте его на debuggex .

Я только что проверил это сообщение (через 2 года), возможно, вы получили ответ, но для тех, кто является новичком, вы можете использовать регулярное выражение для разбивки каждого типа URL-адреса или строки запроса

 (https|http|ftp)\:\/\/|([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4})|\?([a-zA-Z0-9]+[\&\=\#az]+) 

он будет лишать все типы URL-адресов, взгляните на следующий список. Я использовал разные типы доменов для тех, кто хочет спросить: «Разделяет ли он домен .us, .in или .pk и т. Д. Или нет.

  1. ftp://www.web.com
  2. web.net
  3. http://www.website.info
  4. website.us
  5. web.ws?query=true
  6. http://www.web.biz?query=true
  7. ftp://web.in?query=true
  8. media.google.com
  9. ns.google.pk
  10. ww1.smart.au
  11. www3.smart.br
  12. w1.smart.so
  13. ? Ques == два & т = р
  14. http://website.info?ques==two&t=p
  15. https://www.weborwebsite.com

Рабочий пример (проверен на PHP5 +, Apache2 +):

 $str = "ftp://www.web.com, web.net, www.website.info, website.us, web.ws?query=true, www.web.biz?query=true, ftp://web.in?query=true, media.google.com hello world, working more with ns ns.google.pk or ww1.smart.au and www3.smart.br w1.smart.so ?ques==two&t=p http://website.info?ques==two&t=p https://www.weborwebsite.com and ftp://www.hotmail.br"; echo preg_replace("/(https|http|ftp)\:\/\/|([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4})|\?([a-zA-Z0-9]+[\&\=\#az]+)/i", "", $str); 

он вернется

 , , , , , , , hello world, working more with ns or and and 

Надеюсь, это поможет многим программистам.

Если вы хотите сделать эту работу, вам нужно сделать часть «https? //» необязательной, так как вы, похоже, довольно хорошо разбираетесь в регулярных выражениях, я не буду показывать вам, вырезание для читателя 🙂

Но я, как правило, согласен с Nev, это слишком сложно для того, что он делает.

используйте этот шаблон.

 $regex = "(https?\:\/\/|ftp\:\/\/|www\.|[a-z0-9-]+)+([a-z0-9-]+)\.+([az]{2,4})((\/|\.)+([a-z0-9-_.\/]*)$|$)"; 

надеюсь, что полезно.

Мои два цента (пять лет спустя!):

 preg_match("/^((https|http|ftp)\:\/\/)?([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4}|[a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4}|[a-z0-9A-Z]+\.[a-zA-Z]{2,4})$/i", $url) 

Надеюсь, это поможет кому-то