我目前拥有这种精彩的模式,似乎对我来说非常适合匹配链接/网址
int main(void) {
...
save_it_for_later<MACRO_USING_DECLTYPE_OR_SOMESUCH(foo)> saved = {t};
...
}
我使用此模式查找链接并在我的链接周围插入BBCODE,因此如果我的示例文字为/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
,我的输出将为http://www.google.com
困难之处在于,如果我的输入文本中已经包含BBCODE,例如[url]http://www.google.com[/url]
,那么我的输出将获得围绕它的BBCODE的2倍。 [url]http://www.google.com[/url]
我希望以某种方式不匹配已经[url]包含链接的链接。
概要
当前模式:[url][url]http://www.google.com[/url][/url]
当前输出:
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
期望的输出:
http://www.google.com ==> [url]http://www.google.com[/url]
[url]http://www.google.com[/url] ==> [url][url]http://www.google.com[/url][/url]
[url="http://www.google.com"]http://www.google.com[/url] ==> [url][url="http://www.google.com"]http://www.google.com[/url][/url]
答案 0 :(得分:1)
您可以使用丢弃技术,在此正则表达式的开头添加丢弃模式。所以你可以添加一个丢弃模式来摆脱这样的标签:
\[.+?\].*?\[\/.+?\]|(\b(?:https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])
discard this --^
which is [...]...[/...]
<强> Working demo 强>
正如您在下面的屏幕截图中看到的那样,您将使用红色/绿色(原始正则表达式)和蓝色表示丢弃的图案。
只是为了让你知道,丢弃模式包括在正则表达式的右侧添加你想要除去的所有模式,并使用最右边的捕获组,如下所示:
discard patt1 | discard patt2 | discard pattN | (capture this content)
答案 1 :(得分:0)
我会使用此正则表达式并仅在第一组为空(意味着尚未放置bbcode
)时替换为bbcode
/(\[url\])?(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(\[\/url\])?/gi