Сопоставить шаблон url в php с использованием регулярного выражения
Я хочу сопоставить ссылку url в стене и заменить эту ссылку тегом anchor, для этого я использую регулярное выражение ниже.
Мне хотелось бы совместить 4 типа URL:
-
http://example.com
-
https://example.com
-
www.example.com
-
example.com
preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',
'<a href="$1">$1</a>', $subject);
Это выражение соответствует только первым двум типам URL.
Если я использую это выражение для соответствия шаблону url
'@(www?([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@'
, то он соответствует только типу url-шаблона третьего типа.
Как я могу сопоставить все четыре типа шаблона url с одним регулярным выражением?
Ответы
Ответ 1
Я бы использовал другое регулярное выражение, чтобы быть честным. Как и тот, который Gruber опубликовал в 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`!()\[\]{};:'".,<>?«»""‘’]))
Ответ 2
Полный рабочий пример с использованием 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
);
}
Ответ 3
Я огляделся и не увидел, что это именно то, что мне нужно. Я нашел этот, который был близок, поэтому я изменил его следующим образом:
^((([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.
Ответ 4
Я только что проверил этот пост (через 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 любого типа, взгляните на следующий список. Я использовал другой тип доменов для тех, кто хочет спросить: "Это домены типа .us,.in или .pk и т.д. Или нет.
- 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
- ns.google.pk
- ww1.smart.au
- www3.smart.br
- w1.smart.so
- ? Ques == два & амп; т = р
- http://website.info?ques==two&t=p
- 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
Ответ 5
Если вы хотите сделать эту работу, вам нужно сделать часть "https?//" опциональной, так как вы, кажется, довольно хорошо понимаете регулярные выражения, я не буду показывать вам, выступление для читателя:)
Но я вообще согласен с Nev, это слишком сложно для того, что он делает.
Ответ 6
используйте этот шаблон.
$regex = "(https?\:\/\/|ftp\:\/\/|www\.|[a-z0-9-]+)+([a-z0-9-]+)\.+([a-z]{2,4})((\/|\.)+([a-z0-9-_.\/]*)$|$)";
Ответ 7
Мои два цента (пять лет спустя!):
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)
Ответ 8
Это прекрасно работает для меня, в том числе проверка почты:
function LinkIt($text)
{
$t = preg_replace("/(\b(?:(?:http(s)?|ftp):\/\/|(www\.)))([-a-züöäß0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/im", '<a target="_blank" href="#" onclick="location.href='http$2://$3$4'; return false;" class="external-link" title="External Link">$1$4</a>', $text);
return preg_replace("/([\w+\.\-][email protected][\w+\-]+\.[a-zA-Z]{2,4})/im", strtolower('<a href="mailto:$1" class="mail" title="E-Mail">$1</a>'), $t);
}