Intereting Posts
Как определить частичную вертикальную / горизонтальную линию в изображении? Как извлечь определенную строку (электронную почту) из файла через php SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON значения массива в многомерном массиве Как использовать PHP для сравнения одной переменной с любым экземпляром нечетного числа другой переменной? Как преобразовать единый массив в многомерный массив в PHP? Как включить загрузку gif во время загрузки файла и вставки в базу данных Zend Framework – установка макета для контроллера Добавить купон в электронную почту для обработки, только если клиент не использовал один Переменные сеанса, недоступные в подкаталоге Как организовать и управлять ACL? Выполнение функций параллельно в PHP PHP Получить ранги для значений в многомерном массиве Структура файла для PHP-проекта апострофы нарушают мой mysql-запрос в PHP

Преобразование URL-адресов из текста в ссылки, даже если протокол отсутствует

Допустим, что $ content – это содержимое текстового поля

/*Convert the http/https to link */ $content = preg_replace('!((https://|http://)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="$1">$1</a> ', nl2br($_POST['helpcontent'])." "); /*Convert the www. to link prepending http://*/ $content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." "); 

Это работало нормально для ссылок, но понял, что он нарушает разметку, когда изображение находится внутри текста …

Я так стараюсь сейчас:

 $content = preg_replace('!\s((https?://|http://)+[a-z0-9_./?=&-]+)!i', ' <a href="$1">$1</a> ', nl2br($_POST['content'])." "); $content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." "); 

Как и изображения, соблюдаются, но проблема в том, что url с форматом http: // или https: // теперь не будет преобразован ..:

google.com -> Не конвертировано (как и ожидалось)

www.google.com -> Хорошо преобразованный

http://google.com -> Не конвертировано (неожиданно)

https://google.com -> Не конвертировано (неожиданно)

Что мне не хватает?

-РЕДАКТИРОВАТЬ-

Текущее почти рабочее решение:

 $content = preg_replace('!(\s|^)((https?://)+[a-z0-9_./?=&-]+)!i', ' <a href="$2" target="_blank">$2</a> ', nl2br($_POST['content'])." "); $content = preg_replace('!(\s|^)((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$2" target="_blank">$2</a> ', $content." "); 

Дело в том, что если это вход:

www.funcook.com http://www.funcook.com https://www.funcook.com funcook.com http://funcook.com https://funcook.com

Все URL-адреса, которые я хочу (все, кроме name.domain), преобразуются, как ожидалось, но это результат

www.funcook.com http://www.funcook.com https://www.funcook.com; funcook.com http://funcook.com https://funcook.com

Обратите внимание: a; вставляется, любая идея, почему?

попробуй это:

 preg_replace('!(\s|^)((https?://|www\.)+[a-z0-9_./?=&-]+)!i', ' <a href="$2">$2</a> ',$text); 

Он будет получать ссылки, начинающиеся с http: // или с www.

пример

Вы не можете на 100%. Безусловно, могут быть ссылки, такие как stackoverflow.com которые не имеют www. ,

Если вы используете только те ссылки:

 !(www\.\S+)!i 

Должно работать достаточно хорошо для вас.


EDIT: Что касается вашего нового вопроса, почему HTTP-ссылки не преобразуются, а https, ваш первый шаблон ищет только https:// или http://. это не так. Упростите его, заменив:

 (https://|http://\.) 

С

 (https?://) 

Это сделает s необязательным.

Еще один способ добавления гиперссылок состоит в том, что вы можете взять текст, который хотите проанализировать для ссылок, и взорвать его в массив. Затем проведите через него с помощью foreach (очень быстрая функция – http://www.phpbench.com/ ) и измените все, что начинается с http: // или https: // или http://www., Или заканчивается на .com /. org / etc в ссылку.

Я думаю, может быть, что-то вроде этого:

 $userTextArray = explode(" ",$userText); foreach( $userTextArray as &$word){ //if statements to test if if it starts with www. or ends with .com or whatever else //change $word so that it is a link } 

Ваши изменения будут отражены в массиве, так как у вас есть «&» перед $ userText в вашем предложении foreach. Теперь просто взорвите массив обратно в строку, и вам хорошо идти.

Это имело смысл в моей голове … Но я не уверен на 100%, что это то, что вы ищете

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

 function clHost($Address) { $parseUrl = parse_url(trim($Address)); return str_replace ("www.","",trim(trim($parseUrl[host] ? $parseUrl[host].$parseUrl[path] : $parseUrl[path]),'/')); } 

Эта функция вернет домен без протокола и «www», поэтому вы можете добавить их позже.

Например:

 $url = "http://www.". clHost($link); 

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

\s((https?://|www.)+[a-z0-9_./?=&-]+)

Проблема заключается в том, что ваш запуск \ s заставляет совпадение начинаться с пробела, поэтому, если у вас нет этого стартового пространства, ваш матч не удастся. Reg exp отлично (без \ s), но чтобы избежать замены изображений, вам нужно что-то добавить, чтобы избежать их соответствия.

Если изображения являются чистыми html, используйте это: (?<!src=")((https?://|www.)+[a-z0-9_./?=&-]+)

Это будет искать src = "перед URL-адресом, чтобы игнорировать его.

Если вы используете другую отметку, скажите мне, и я попытаюсь найти другой способ избежать изображений.