Итак, я знаю, что на SO есть много связанных вопросов, но ни один из них не совсем то, что я ищу. Я пытаюсь реализовать функцию PHP, которая будет конвертировать текстовые URL-адреса из созданного пользователем сообщения в ссылки. Я использую «улучшенное» Regex из Daring Fireball в нижней части страницы: http://daringfireball.net/2010/07/improved_regex_for_matching_urls Функция ничего не возвращает, и я не знаю, почему.
<?php if ( false === function_exists('linkify') ): function linkify($str) { $pattern = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”'']))'; return preg_replace($pattern, "<a href=\"\\0\" rel=\"nofollow\" target=\"_blank\">\\0</a>", $str); } endif; ?>
Может кто-то, пожалуйста, помогите мне заставить это работать? Благодаря!
Попробуй это:
$pattern = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'".,<>?«»“”'']))'; return preg_replace("!$pattern!i", "<a href=\"\\0\" rel=\"nofollow\" target=\"_blank\">\\0</a>", $str);
Функция preg
PHP действительно нуждается в разделителях . i
в конце делает его нечувствительным к регистру
Если вы используете #
как разделитель, вам не нужно бежать !
в шаблоне как таковой используется исходная строка шаблона (у шаблона нет #
): "#$pattern#i"
Чтобы убедиться, что ссылки правильные, сделайте следующее:
$pattern = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”'']))'; return preg_replace_callback("#$pattern#i", function($matches) { $input = $matches[0]; $url = preg_match('!^https?://!i', $input) ? $input : "http://$input"; return '<a href="' . $url . '" rel="nofollow" target="_blank">' . "$input</a>"; }, $str);
Теперь он добавит http://
к URL-адресам, чтобы браузер не думал, что это относительная ссылка.
Я просто хотел получить URL-адреса из строки, используя одно и то же регулярное выражение из ответа выше, на d_inevitable, и не хотел превращать их в ссылки или заботиться о остальной части строки, мне нужны только URL-адреса в строке, поэтому это то, что я сделал. Надеюсь, поможет.
/** * Returns the urls in an array from a string. * This dos NOT return the string, only the urls with-in. */ function get_urls($str){ $regex = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”'']))'; preg_match_all("#$regex#i", $str, $matches); $urls = $matches[0]; return $urls; }