2016-01-25 70 views
1

我試圖將[quote =「author」] text [/ quote]轉換爲格式化的div區塊。preg_match_all和preg_replace foreach循環

$p_text

[quote="person1"]Hello![/quote] 
[quote="person2"]Hi![/quote] 

功能:

function bbCode($p_text){ 

     $pattern = '/\[quote="(.+?)"\]/'; // matches the author name, i.e. person1 
     preg_match_all($pattern, $p_text, $matches); 

     $authorCounter = 0; 

     foreach ($matches as $matchgroup) { 

     $author = $matchgroup[$authorCounter]; 

     $pattern1 = '/\[quote=".+?"\]/'; // captures [quote="..."] 
     $replacement1 = '<div class="quote"><strong class="quote-author">' . $author . ' wrote:</strong><br>'; 
     $p_text = preg_replace($pattern1, $replacement1, $p_text); 

     $authorCounter++; 
     } 

     $pattern2 = '/\[\/quote\]/'; // captures [/quote] 
     $replacement2 = '</div>'; 
     $p_text = preg_replace($pattern2, $replacement2, $p_text); 

     return $p_text; 

} 

這與 「PERSON2」 更換兩個帖的作者,因爲第二foreach迭代再次替換文本(?)。我怎樣才能確保每個報價都有正確的人名?

+0

請試試我的庫解析簡碼和BBCodes:https://github.com/thunderer/Shortcode。如果您需要更多信息,請提交問題,我會提供幫助。 –

回答

0

你可以用一個正則表達式來完成。訣竅是將搜索模式的某些部分放在括號中,並使用$1,$2等來指代替換模式中的那些部分。

$string = '[quote="person1"]Hello![/quote][quote="person2"]Hi![/quote]'; 
$output = preg_replace('/\[quote="([^"]+)"\]([^[]+)\[\/quote\]/', '<div class="quote"><strong class="quote-author">$1 wrote:</strong><br>$2</div>', $string); 

echo $output; 

輸出:

<div class="quote"><strong class="quote-author">person1 wrote:</strong><br>Hello!</div> 
<div class="quote"><strong class="quote-author">person2 wrote:</strong><br>Hi!</div> 

活生生的例子在http://sandbox.onlinephpfunctions.com/code/3e8dd7798b29df5bd161eb01f7c11329fc13283f

+0

謝謝!完美的作品。我希望我對正則表達式更熟練,我只是剛剛開始學習,所以我不知道一些更高級的方法:\ – frosty

+0

不幸的是,在PHP手冊中的一些解釋並不是很好。使用正則表達式並不難,只需檢查手冊中的一些示例,然後使用像http://www.regexpal.com/這樣的工具來處理您的正則表達式。 – maxhb