php - автоматически обнаруживает ссылки и помещает их в тег <a>, кроме случаев, когда они уже находятся в теге html - PullRequest
4 голосов
/ 01 февраля 2012

Я нашел решение для автоматического определения ссылок и помещения их в тег <a> здесь: Regex PHP - Автоматическое определение YouTube, изображений и «обычных» ссылок

Соответствующая часть (мне пришлось переместить функцию за пределы вызова preg_replace_callback из соображений совместимости):

function put_url_in_a($arr)
    {
    if(strpos($arr[0], 'http://') !== 0)
        {
            $arr[0] = 'http://' . $arr[0];
        }
        $url = parse_url($arr[0]);

        //links
        return sprintf('<a href="%1$s">%1$s</a>', $arr[0]);
    }

$s = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:\S+\.\S+)#', 'put_url_in_a', $s);

Это прекрасно работает, за исключением случаев, когда он наталкивается на URL-адрес в теге, который затем разрушает (помещая в него другой тег). Это также разрушает встроенные носители.

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

1 Ответ

8 голосов
/ 01 февраля 2012

Один вариант - если URL уже находится в ссылке, он должен начинаться с префикса href=', поэтому исключите ссылки с отрицательным внешним видом утверждение:

#(?<!href\=['"])(?:https?://\S+)|(?:www.\S+)|(?:\S+\.\S+)#

РЕДАКТИРОВАТЬ: - фактически вышеупомянутая форма не будет работать, потому что совпадение URL слишком общее, оно превратит такие вещи, как ... в ссылку, неправильно. Использование моей любимой схемы сопоставления URL-адресов работает правильно:

$s = preg_replace_callback('#(?<!href\=[\'"])(https?|ftp|file)://[-A-Za-z0-9+&@\#/%()?=~_|$!:,.;]*[-A-Za-z0-9+&@\#/%()=~_|$]#', 'regexp_url_search', $s);

Например: http://codepad.viper -7.com / TukPdY

$s = "The following link should be linkified: http://www.google.com but not this one: <a href='http://www.google.com'>google</a>."`

становится:

The following link should be linkified: <a href="http://www.google.com">http://www.google.com</a> but not this one: <a href='http://www.google.com'>google</a>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...