Даже я голосую за дубликат, общее предложение: Разделяй и властвуй .
В вашей входной строке все "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
, чтобы полностью удовлетворить ваши потребности.Веселитесь!