我正在寻找可以改变我的字符串的好的正则表达式:
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]
你可以请一下建议吗?
答案 0 :(得分:2)
即使我投票给重复,一般建议:分而治之。
在输入字符串中,所有“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);
}
这已经运行了您的问题示例字符串(Demo):
$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
功能即可满足您的需求。玩得开心!