2009-12-27 102 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