Преобразование текста в ссылку - проблема с регулярным выражением php - PullRequest
0 голосов
/ 23 февраля 2012

У меня небольшая проблема с преобразованием обычного текста в URL. Что мне нравится, так это если у меня есть такой текст: www.google.com, он конвертируется в

<a href="www.google.com" target="_blank">www.google.com</a>

Я вроде как новичок в RegEx, но я попробовал это:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description);

Описание var - это фрагмент текста, который МОЖЕТ содержать неконвертированные URL.

С кодом выше, я получаю это как ссылку:

<a target="_blank">www.google.com</a>

Таким образом, часть href пропущена. Это должно быть легким делом для вас, волшебников RegEx, поэтому спасибо заранее за каждую помощь.

Если есть другой (лучший?) Способ преобразования обычного текста в URL, вы можете сказать об этом, и я попробую.

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

Если ваша единственная проблема заключается в том, что ссылка неверно указывает на www.google.com вместо полностью определенного URL, такого как http://www.google.com, то правильная замена будет:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description);
1 голос
/ 23 февраля 2012

<a href="www.example.com">www.example.com</a> не будет работать правильно в современных браузерах, поскольку значение href будет просто добавлено к URL текущей страницы, например, http://example.com/www.example.com. Вам нужно указать протокол, т.е. http / https и т. д.

Следующая команда заменит все текстовые «ссылки», начиная с ftp, http, https и файла с тегами html a

<?php

    $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i';
    $string = 'hello http://example.com https://graph.facebook.com    http://www.example.com www.google.com';

    function create_a_tags( $matches ){

        $url = $matches[0];
        if ( 'www' == $matches[1] ){
            $url = 'http://' . $matches[0];
        }
        $escaped = htmlspecialchars($matches[0]);
        return sprintf( '<a href="%s">%s</a>', $url, $escaped );
    }

    echo preg_replace_callback( $pattern, 'create_a_tags', $string );

?>

печать

hello <a href="http://example.com">http://example.com</a>
<a href="https://graph.facebook.com">https://graph.facebook.com</a>
<a href="http://www.example.com">http://www.example.com</a>
<a href="http://www.google.com">www.google.com</a>
0 голосов
/ 23 февраля 2012

Я нашел решение.Это действительно не имело ничего общего с RegEx, это было правильно.Мой коллега добавил эту строку кода jquery в голову:

$("a").removeAttr('href');

Так что, очевидно, атрибут href был удален.Я не смотрел на это, потому что был уверен, что это проблема php / regex.Устранение этой проблемы решило проблему.

Я понимаю, что это глупая ошибка, и вы не могли ее решить, так что спасибо всем за помощь, +1 вам, ребята.

0 голосов
/ 23 февраля 2012

Некоторое время назад мы сравнивали разные подходы к проверке и идентификации URL. См. Таблицу регулярных выражений .

Я предлагаю вам отказаться от своего регулярного выражения и использовать взамен gruber, исправленный . Решение (PHP 5.3) может выглядеть следующим образом:

<?php

$string = 'hello 
http://example.com 
https://graph.facebook.com 
http://www.example.com
www.google.com
ftp://example.com';

$string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#iS', function($m) {
    // use http as default protocol, if none given
    if (strpos($m[0], '://') === false) {
        $m[0] = 'http://' . $m[0];
    }
    // text -> html is a context switch, take care of special characters
    $_m = htmlspecialchars($m[0]);
    return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>';
}, $string);

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