2010-11-08 109 views
0

我想做一個功能,拿出方括號中的內容,但我不能刪除我需要刪除的大括號。幫助preg_match_all,刪除方括號

這是它應該如何看:

Hello [there] blabla 

假作:

Hello <a href="http://blabla.com/index.php?id=there">linky</a> blabla 

我當前的代碼:

$txt='Hello [there] blabla'; 

$re1='.*?'; # Non-greedy match on filler 
$re2='(\\[.*?\\])'; # Square Braces 1 

if ($c=preg_match_all ("/".$re1.$re2."/is", $txt, $matches)) 
{ 
    $sbraces1=$matches[1][0]; 
    print "<a href='http://blabla.com/index.php?id=$sbraces1'>Linky</a> \n"; 
} 

我當前的代碼做到這一點:

Hello [there] blabla 

假作:

<a href='http://blabla.com/index.php?id=[there]'>Linky</a> 
+0

難道不更好地使用preg_replace這種方式,你不必重建你的字符串? – Brady 2010-11-08 15:44:48

回答

1

更好地利用preg_replacepreg_replace_callback使用此模式:

\[(.*?)\] 

這裏括號內的部分進行分組,而不是它的內容整個支架。

隨着preg_replace_callback你再可以寫一個函數,它接受了比賽,把它變成一個鏈接:

function callback_linkify($match) { 
    return '<a href="http://example.com/index.php?id='.urlencode($match[1]).'">Linky</a>'; 
} 

而且採用該模式,並在回調函數:

$output = preg_replace_callback('/\[(.*?)\]/', 'callback_linkify', $str); 
0

捕獲的部分反向引用括號之間:

\[([^\]]*)\] 

,然後使用第一個反向引用,而不是在它的位置在全場比賽。

0

如果你想匹配的方括號,內內容,您可以嘗試使用這樣的:

"(\\[)([^\\]]*)(\\])"

我只希望我正確轉義括號。

+0

除非您以後需要分別引用括號,否則不需要將它們放入單個組中。 – Joey 2010-11-08 15:47:45

+0

@Joey我同意。我只是不確定他是否寧願在括號內進行替換,而不是在整個匹配的字符串上進行替換。 – zzzzBov 2010-11-08 15:57:01

1

這個怎麼樣?

編輯:

<?php 
$string = 'Hello [there] blabla'; 
$re2='(\\[)([^\\]]*)(\\])'; # Square Braces 1 
$pattern = "/".$re2."/is"; 
$replacement = '<a href="http://blabla.com/index.php?id=$2">linky</a>'; 
echo preg_replace($pattern, $replacement, $string); 
?> 
+0

http://codepad.org/9pWmEdtA正常工作:) – Shikiryu 2010-11-08 16:12:17

+0

請不要發佈完全由其他網站鏈接組成的答案。包含指向pastebin網站的鏈接是可以的,但是如果沒有它們,你的答案應該是合理的。如果代碼太長而無法發佈(而你的代碼不是這樣),請提取最重要的部分並添加一些說明文字。 – 2010-11-08 19:43:05

+0

@Alan Moore,我會在這裏發佈代碼,但是每當我將代碼放在pre和代碼標籤位代碼disapears中。將代碼放在像PastBin這樣的服務中是我可以保證所有代碼都被保留的唯一方法 – Brady 2010-11-09 10:14:52