сопоставить шаблон URL в php используя регулярное выражение - PullRequest
10 голосов
/ 11 октября 2010

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

Я бы хотел совпадать с 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 с одним регулярным выражением?

Ответы [ 7 ]

15 голосов
/ 25 июля 2012

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

public function clickableUrls($html){
    return $result = preg_replace(
        '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s',
        '<a href="$1">$1</a>',
        $html
    );
}
15 голосов
/ 11 октября 2010

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

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

или эта обновленная версия, которую Грубер опубликовал в 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`!()\[\]{};:'".,<>?«»“”‘’]))
2 голосов
/ 28 марта 2013

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

^((([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 .

1 голос
/ 01 ноября 2012

Я только что проверил этот пост (через 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]+)

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

  1. ftp: //www.web.com
  2. web.net
  3. www.website.info
  4. website.us
  5. web.ws? query = true
  6. 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 ==two & 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

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

0 голосов
/ 23 июня 2015

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

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)

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

0 голосов
/ 28 мая 2013

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

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

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

0 голосов
/ 11 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...