Я знаю, что видел это много, но мне нужно нечто большее, чем норма. К сожалению, когда я ищу это где-нибудь, он зарывается в сообщения о простое подключение ссылки 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&ap=1 blah">www.facebook.com</a>
который не работает вообще, поскольку он берет текст вокруг ссылки с ним. Он отлично работает, если только кто-то комментирует ссылку. Это когда я изменил функцию на это
preg_replace("#^(.*)//(.*)/(.*)$#",'<a class="bwl" href="\0">\2</a>', htmlspecialchars($body, ENT_QUOTES));
Это простой и чистый путь:
$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