Замените не HTML-ссылки тегами <A> - PullRequest
1 голос
/ 26 января 2010

У меня есть блок кода, который будет принимать блок текста, подобный следующему:

Образец текста образца текста http://www.google.com Образца текста

Используя метод preg_replace_callback и следующее регулярное выражение:

preg_replace_callback('/http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/',
    create_function(
        '$matches',
        '$url = $matches[1]; 
        $anchorText = ( strlen($url) > 35 ? substr($url, 0, 35).\'...\' : $url); 
        return \'<a href="http://\'. $url .\'">\'. $anchorText .\'</a>\';'),
    $str);

Преобразует образец текста, чтобы выглядеть так:

Образец текста Образец текста http://www.google.com образец текста

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

1 Ответ

0 голосов
/ 26 января 2010

Добавьте код в начало шаблона для захвата открывающего тега привязки, а затем не выполняйте код обратного вызова, когда он что-то захватил:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/

Затем вам нужно будет добавить if кваша функция lamda, чтобы увидеть, есть ли что-то в $ match [1] (не забывайте также увеличивать ваши захваты)

Вы не можете использовать отрицательный взгляд за утверждением здесь, так как захват не фиксированной длины, но вы можете использовать отрицательное предпросмотр для закрывающего тега, чтобы он отбрасывал все совпадения:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/
...