2013-06-17 4 views
0

Я создал систему сообщений и хотел бы автоматически конвертировать url-ссылки в сообщении для интерактивных ссылок HTML, если опубликовано новое сообщение. Я написал эту простую функцию, но она не работает должным образом:ereg_replace не работает правильно

// LINK ALL URLS 
    $message = ereg_replace("http://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $message); 
    $message = ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $message); 

Для некоторых URLs он работает, но и с другими URLs есть проблемы и результаты, как это:

<a href="http://www.example.com/index.php">http://www.example.com/index.php</a>?mode=index&page=1 

или

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

Как вы можете видеть, это не правильно конвертированы включительно часть за знак вопроса. Может кто-нибудь исправить/обновить мой код выше? И, кстати, может быть, возможно, другое (и лучшее!) Решение вместо использования * ereg_replace *?

+5

Эта функция ДЕФИЦИРОВАНА с PHP 5.3.0. Опираясь на эту функцию, очень не рекомендуется. Обход проблемы: используйте 'preg_replace()' – hek2mgl

+0

Спасибо за эту информацию, я знал, что это было DEPRECATED, пока я просто искал быстрое исправление, в будущем я буду использовать preg_replace(). –

+0

это зависит от вас;) – hek2mgl

ответ

1

Ваше регулярное выражение не допускает символ ?, поэтому, конечно, ссылка отключается перед любой строкой запроса. класть ? в ваш характер класс. Пока вы на нем, вам также нужно разрешить все другие допустимые URL-адреса.

Проконсультируйтесь с this question и его ответами на вопрос о том, что делает допустимым URL-адрес регулярного выражения.

+0

Вы правы, поставили вопросительный знак в разрешенные части персонажей, и теперь он работает. Спасибо –

2
$message = preg_replace('#((?:[a-zA-Z]+://|www)[^ ]+)#i', '<a href="$0">$0</a>', $message); 

Это может помочь вам

+0

еще более профессиональным и короче, чем мой код, и он работает –

+0

Ой, подождите, он работает, но только если в сообщении только ** одна ссылка **, но с более чем 1 ссылкой она работает неправильно, у вас есть решение для этого? –

2

Это решение я использую в настоящее время, который, кажется, чтобы работать правильно, включая знак вопроса исправления и предложения в комментариях к преобразующие ereg_replace() в preg_replace() :

// LINK ALL URLS 
     $message = preg_replace("#http://([.]?[a-zA-Z0-9_/-?])*#", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $message); 
     $message = preg_replace("#(^| |\n)(www([.]?[a-zA-Z0-9_/-?])*)#", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $message); 
Смежные вопросы