2010-01-10 89 views
0

我写了一个正则表达式来去掉BBCode标签 - 它只是将允许的标签去掉(以后再计算没有标签的字符串长度)。PHP RegEx扩展 - 如何仅剥离url = *?

我不是专家,当谈到正则表达式 - 那么一个小时后,我发现这几乎工作:

$pattern = "/\[\/?(i|b|u|url(.*?)|list|li)[\]\[]*\]/i"; 
$stripped = preg_replace($pattern, '', $text); 

只剥去允许了六个标签(并没有更多的 - 它是应该)以及可以像'url = http://someurl'一样扩展的特殊标记'url'。

I.e.

in: [url=someurl]Lorem[/url] ipsum [test]dolor[/test] sit [b]amet[/b]. 
out: Lorem ipsum [test]dolor[/test] sit amet. 

但问题是,它不只是去掉'url = [sometext]',而且'urlipsum'。 我试图添加一个'='进行解析,但无法达到这一点。

有没有人有我的提示如何只删除网址时,它= =?

+1

BBCode是一种太复杂的语言,不能被正则表达式解析。你有没有试过BBCode解析器? – 2010-01-10 12:07:40

+0

我有一个输出组件,但没有只剥去所有标签。我只是用它来计算长度 - 因为在插入标签时,bbcode标签不会被视为使用的字符。 我发现BBcode的梨类无法达到我的期望,做得比我想要的还要多。 – 2010-01-10 12:13:36

回答

1

尝试:“ *?”

$pattern = '/\[\/?(i|b|u|url(=[^\]]+)?|list|li)[\]\[]*\]/i'; 
+0

这太棒了!非常感谢你! 我添加了额外的测试协议 - 因为我不想要比http(s),ftp和mailto: “/ \ [\ /?(i | b | u | url(=(http | https | ftp | mailto)[^ \]] +)?| list | li)[\] \ [] * \]/i“ – 2010-01-10 12:10:19

0
$pattern = "/\[\/?(i|b|u|url=(.*?)|url(?=\])|list|li)[\]\[]*\]/i"; 
+0

这也会剥去url-tag而不是等号 - 我会保留它心神。 – 2010-01-10 12:10:56

0

您可能需要改变量词的“贪婪”,尝试将“U”模式修改或删除问号,看PHP doc