Допустим, что $ 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-адресом, чтобы игнорировать его.
Если вы используете другую отметку, скажите мне, и я попытаюсь найти другой способ избежать изображений.