PHP: регулярное выражение для изменения URL - PullRequest
0 голосов
/ 25 февраля 2012

Я ищу хорошее регулярное выражение, которое может изменить строку:

text text website.tld text text anotherwebsite.tld/longeraddress text http://maybeanotheradress.tld/file.ext

на bbcodes

text text [url=website.tld]LINK[/url] text text [url=anotherwebsite.tld/longeradress]LINK[/url] text text [url=http://maybeanotheradress.tld/file/ext]LINK[/url]

Не могли бы вы посоветовать?

1 Ответ

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

Даже я голосую за дубликат, общее предложение: Разделяй и властвуй .

В вашей входной строке все "URL-адреса" не содержат пробелов.Таким образом, вы можете разделить строку на части, которые не содержат пробелов:

$chunks = explode(' ', $str);

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

/**
 * @return bool
 */
function is_text_link($str)
{
    # do whatever you need to do here to tell whether something is
    # a link in your domain or not.

    # for example, taken the links you have in your question:

    $links = array(
        'website.tld', 
        'anotherwebsite.tld/longeraddress', 
        'http://maybeanotheradress.tld/file.ext'
    );

    return in_array($str, $links);
}

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

Поскольку теперь вы можете сказать, что такое ссылка, а что нет, осталась только одна проблема - как создать BBCode из ссылки, это довольно простая строковая операция:

 if (is_link($chunk))
 {
     $chunk = sprintf('[url=%s]LINK[/url]', $chunk);
 }

Итак, технически все проблемы были решены, и их необходимо собрать воедино:

function bbcode_links($str)
{
    $chunks = explode(' ', $str);
    foreach ($chunks as &$chunk)
    {
        if (is_text_link($chunk))
        {
             $chunk = sprintf('[url=%s]LINK[/url]', $chunk);
        }              
    }
    return implode(' ', $chunks);
}

Это уже выполняется с примером строки ввопрос ( Демонстрация ):

$str = 'text text website.tld text text anotherwebsite.tld/longeraddress text http://maybeanotheradress.tld/file.ext';

echo bbcode_links($str);

Вывод:

text text [url=website.tld]LINK[/url] text text [url=anotherwebsite.tld/longeraddress]LINK[/url] text [url=http://maybeanotheradress.tld/file.ext]LINK[/url]

Затем вам нужно только настроить свою функцию is_link, чтобы полностью удовлетворить ваши потребности.Веселитесь!

...