2012-02-15 84 views
0

我想使用preg_replace結合'[',']'和'/',但我無法找到正確的方法!preg_replace和組合'[',']'和'/'替換

我有這些字符串:

$str = "This is a [u]PHP[/u] test . This is second[/u] test. 
This [u]is another [u]test[/u]."; 

$url = "http://www.test.com"; 

在結果我想有:

str1 = "This is a <a href='http://www.test.com'>PHP</a> test . 
This is second[/u] test. 
This <a href='http://www.test.com'>is another [u]test</a>."; 

並且還[U] = [U],[/ U] = [/ U]是不區分大小寫。

+0

您無法使用preg_replace來平衡標籤。 – 2012-02-15 11:22:36

+0

...不僅僅帶有'preg_replace'。 – Gumbo 2012-02-15 11:26:51

回答

1

假設沒有開口方括號內的[u]標籤內:

preg_replace('~\[u\]([^[]+)\[/u\]~i', '<a href="'.$url.'">$1</a>', $str); 

正則表達式說明:

  • ~被用作分隔符,以避免leaning slash syndrome
  • \[\]匹配文字方括號
  • ()表示一個俘獲基團,其在替換字符串是$1
  • [^[]+匹配任何不是一個開口括號一次或多次
  • i改性劑使正則表達式不區分大小寫。
1

嗯,我想你想要的是

$str = "This is a [u]PHP[/u] test . This is second[/u] test. 
This [u]is another [u]test[/u]."; 

$url = "http://www.test.com"; 

echo preg_replace('#\[u\]((?:(?!\[/u\]).)*)\[/u\]#is',"<a href='{$url}'>\\1</a>",$str); 

((?:(?!\[/u\]).)*)意味着它會匹配一些字符,不包括字符串 '[/ U]'

1
$str1 = preg_replace('#\[(u|U)\](.*?)(?=\[/\1)\[/\1\]#', "<a href='http://www.test.com'>$2</a>", $str); 
var_dump($str, $str1); 

輸出

string(85) "This is a [u]PHP[/u] test . This is second[/u] test. 
This [u]is another [u]test[/u]." 
string(139) "This is a <a href='http://www.test.com'>PHP</a> test . This is second[/u] test. 
This <a href='http://www.test.com'>is another [u]test</a>."