URL-адрес PHP для связи с Regex

Я знаю, что видел это много, но мне нужно нечто большее, чем норма. К сожалению, когда я ищу это где-нибудь, он зарывается в сообщения о простое подключение ссылки html-тега. Я хочу, чтобы функция PHP выделяла «http: //» и «https: //» из ссылки, а также что-нибудь после. * Поэтому в основном то, что я ищу, это превратить A в B.

A: http://www.youtube.com/watch?v=spsnQWtsUFM B: <a href="http://www.youtube.com/watch?v=spsnQWtsUFM">www.youtube.com</a> 

Если это помогает, вот моя текущая функция замены регулярных выражений PHP.

 ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\" class=\"bwl\" target=\"_new\">\\0</a>", htmlspecialchars($body, ENT_QUOTES))); 

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

EDIT: Когда я ввел комментарий, как этот blahblah https://www.facebook.com/?sk=ff&ap=1 blah я получаю html, как этот <a class="bwl" href="blahblah https://www.facebook.com/?sk=ff&amp;ap=1 blah">www.facebook.com</a> который не работает вообще, поскольку он берет текст вокруг ссылки с ним. Он отлично работает, если только кто-то комментирует ссылку. Это когда я изменил функцию на это

 preg_replace("#^(.*)//(.*)/(.*)$#",'<a class="bwl" href="\0">\2</a>', htmlspecialchars($body, ENT_QUOTES)); 

Related of "URL-адрес PHP для связи с Regex"

Это простой и чистый путь:

 $str = 'http://www.youtube.com/watch?v=spsnQWtsUFM'; preg_match("#//(.+?)/#", $str, $matches); $site_url = $matches[1]; 

EDIT: Я предполагаю, что $ str был проверен как URL-адрес в первую очередь, поэтому я оставил это. Кроме того, я предполагаю, что все URL-адреса будут содержать либо «http: //», либо «https: //». Если URL-адрес отформатирован следующим образом: www.youtube.com/watch?v=spsnQWtsUFM или даже youtube.com/watch?v=spsnQWtsUFM , указанное выше регулярное выражение не будет работать!

EDIT2: Извините, я не понимал, что вы пытались заменить все строки в целом. В этом случае это должно работать так, как вы этого хотите:

 $str = preg_replace('#(\A|[^=\]\'"a-zA-Z0-9])(http[s]?://(.+?)/[^()<>\s]+)#i', '\\1<a href="\\2">\\3</a>', $str); 

Я тоже не свист с регулярным выражением,

 ^(.*)//(.*)/(.*)$ <a href="\1//\2/\3">\2</a> 

это то, что сработало для меня, когда я пытался использовать его как найти и заменить в блокноте программиста.

^ (. ) // должен извлечь протокол – обозначенный как \ 1 во второй строке. (. ) / должен извлекать все до первого / – называемого \ 2 во второй строке. (. *) $ захватывает все до конца строки. – обозначается как \ 3 во второй строке.


Добавлено позже

 ^(.*)( )(.*)//(.*)/(.*)( )(.*)$ \1\2<a href="\3//\4/\5">\4</a> \7 

Это должно быть немного лучше, но будет заменено только 1 URL

\ 0 заменяется всей совпадающей строкой, тогда как \ x (где x – число, отличное от 0, начиная с 1), будет заменено на каждую подчасти вашей согласованной строки на основе того, что вы завершаете в круглых скобках, и порядок, в котором эти группы отображаются , Ваше решение выглядит следующим образом:

 ereg_replace("[[:alpha:]]+://([^<>[:space:]]+[:alnum:]*)[[:alnum:]/]", "<a href=\"\\0\" class=\"bwl\" target=\"_new\">\\1</a> 

Я не смог проверить это, хотя так дайте мне знать, если это сработает.

Я думаю, что это должно это сделать (я не проверял его):

 preg_match('/^http[s]?:\/\/(.+?)\/.*/i', $main_url, $matches); $final_url = '<a href="'.$main_url.'">'.$matches[1].'</a>'; 

Я удивлен, что никто не помнит функцию parse_url PHP:

 $url = 'http://www.youtube.com/watch?v=spsnQWtsUFM'; echo parse_url($url, PHP_URL_HOST); // displays "www.youtube.com" 

Я думаю, вы знаете, что делать дальше.

$result = preg_replace('%(http[s]?://)(\S+)%', '<a href="\1\2">\2</a>', $subject);

Код с регулярным выражением не работает полностью.

Я сделал этот код. Он гораздо более всеобъемлющий, но он работает:

См. Результат здесь: http://cht.dk/data/php-scripts/inc_functions_links.php

Смотрите исходный код здесь: http://cht.dk/data/php-scripts/inc_functions_links.txt