2009-12-27 90 views
0

我的RegEx有问题。我想翻译就像一个BB代码链接RegEx帮助

[链接= www.stackoverflow.com]栈溢出[/链接]

成HTML链接像

<a href='www.stackoverflow.com'>Stack-Overflow</a>. 

在我字符串可以在BBCode中创建多个链接。 我也需要一个函数来将html转换回BBCode。

我的功能 BB代码为HTML:

$Text = preg_replace('/\[link=([^ ]+).*\](.*)\[\/link\]/', '<a href="$1">$2</a>', $Text); 

HTML要BB代码:

$Text = preg_replace('/\<a href="([^ ]+).*\">(.*)\<\/a\>/Usi', '[link=$1]$2[/link]', $Text); 

我的问题是thees功能,当我有一个以上的链接,这是行不通的,当我有一个链接翻译成HTML,我想翻译回来,我只有链接的第一个字符。

大家能帮帮我吗? 在此先感谢

+2

请注意:http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html – pavium 2009-12-27 11:56:25

回答

5

至于你的第一个问题,*是贪婪的,所以它捕获了第一个和最后一个链接之间的一切。一个简单的解决方法是使用一个非贪婪限定符,或者不允许在组[]

\[link=([^ \[\]]+)\]([^\[\]]*)\[\/link\] 

同样,对于周围的其他方法:

<a href="([^ "]+)">([^<]*?)\<\/a\> 

这里的非贪婪版本。它允许在链接[],以及更短:

\[link=([^ ]*?)\](.*?)\[\/link\] 
+1

使用非贪婪限定符是足够好,并且将在链接允许[],因为这可能会发生。例如。 example.com/?arr[]=1&arr[]=2 – 2009-12-27 11:58:46

+0

好点。谢谢,Tor。 – Kobi 2009-12-27 12:07:02

+0

感谢您的帮助。这非常有用。 它完美的作品。 – wildhaber 2009-12-27 12:11:25

0

你的问题是与贪婪* 使用?使其不贪婪。

$Text = preg_replace(
    '/\[link=([^ ]+).*?\](.*?)\[\/link\]/', 
    '<a href="$1">$2</a>', 
    $Text 
); 
+0

它必须在parens里面,否则它会做一些完全不同的事情。 – 2009-12-27 11:59:49

+0

哎呀,是的,我的坏。编辑纠正错误。 – slebetman 2009-12-27 12:36:39