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

Я хочу сопоставить ссылку url в wall post и заменить эту ссылку тегом 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=""></a>', $subject);

это выражение соответствует только первым двум типам url.

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

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

7 ответов


Я бы использовал другое выражение, чтобы быть честным. Как вот этот Грубер!--3-->опубликовано в 2009 году:

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

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

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

полный рабочий пример с использованием Ник Стоукс дали ссылку:

public function clickableUrls($html){
    return $result = preg_replace(
        '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s',
        '<a href=""></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]+[\&\=\#a-z]+)

он будет лишать каждый тип URL-адресов, взгляните на следующий список. Я использовал разные типы доменов для тех, кто хочет спросить "будет ли это раздеваться .мы .в операционной .PK etc тип доменов или не.

  1. ftp://www.web.com
  2. web.net
  3. www.website.info
  4. сайт.США
  5. web.ws?query=true
  6. www.web.biz?query=true
  7. ftp://web.in?query=true
  8. media.google.com
  9. ns.Гугл.pk
  10. ww1.умная.au
  11. www3.умная.br
  12. w1.умная.так что
  13. ?ques= = два&t=p
  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]+[\&\=\#a-z]+)/i", "", $str);

вернет

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

надеюсь, что это поможет много кодеров там


Если вы хотите, чтобы это сработало, вам нужно сделать "https?// "часть необязательно, так как вы, кажется, довольно хорошо понимаете regexps я не буду показывать Вам, выдержка для читателя:)

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


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

$regex = "(https?\:\/\/|ftp\:\/\/|www\.|[a-z0-9-]+)+([a-z0-9-]+)\.+([a-z]{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)

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