Нужно расширить этот regex URL / анализатор почты немного дальше - PullRequest
0 голосов
/ 29 января 2012
function make_clickable($text)
{
    $ret = ' ' . $text;
    $ret = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", "'\\1<a href=\"\\2\" >\\2</a>'", $ret);
    $ret = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#ise", "'\\1<a target=\"_blank\" href=\"http://\\2\" >\\2</a>'", $ret);
    $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
    $ret = substr($ret, 1);
    return($ret);
}

, а также убедитесь, что другие домены, подобные этим, все еще работают:

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

Я знаю, что есть ограничения для регулярных выражений, и это может быть одно, но любая помощь вообще будет принята с благодарностью. Я также заметил, что этот сайт использует хороший JavaScript для очень удобного разбора URL. Он работал на каждом из моих «проблемных» доменов, кроме одного с (). Кто-нибудь может показать мне, где находится JS-парсер stackoverflow? Я не смог найти его.

Еще один вопрос: я делаю это для газетного сайта (для автоматического разбора ссылок, которые авторы могут написать в своих историях, а также автоматических почтовых адресов электронной почты). Я думаю, что было бы лучше использовать javascript и позволить каждому клиентскому компьютеру отображать ссылки таким образом. Но я также хочу, чтобы он был надежным, поэтому проблемы с браузерами и такие вещи, как noscript, могут проявиться таким образом. Есть мысли?

Ответы [ 2 ]

0 голосов
/ 29 января 2012

Нет никакого способа сделать ваш текущий подход соответствующим стандартам, и я не могу быть обеспокоен также.Поскольку вы просто запрашиваете кодекс blackbox / magic regex, простой обходной путь будет отрицательным утверждением:

 (?<![.?;:)])

Добавьте это в своем регулярном выражении прямо перед #ise, поэтомуэто не будет соответствовать этим персонажам в самом конце.

0 голосов
/ 29 января 2012

Мне кажется, вы хотите, чтобы начальная (^|[\n ]) была заменена на \b, и еще на миллион других проблем ... Возможно изменить: [^ \"\n\r\t<]* на (\w|\W(?=\w|$)) для второй:

preg_replace('#\b(www|ftp)\.(\w|\W(?=\w|$))+#ise', '<a target="_blank" href="http://\\0" >\\0</a>', $ret);

... но это только для начала ... Это нелегко, и я не хочу тратить время на то, чтобы сделать это более полным доказательством;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...