2015-11-14 73 views
2

好吧,所以我試圖在我的網站評論部分中使用bbcode替換真的很長的引號,我試圖做的是在摺疊中包裝長引號我已經在js中編碼和CSS。用preg_replace_callback和str_replace替換文本

我的問題是,它會做第一次報價,然後任何其他報價消失。我明顯錯過了一些東西,但這是我第一次使用這種回調。

這裏是我的PHP代碼,現在要做到這一點:

$body = preg_replace_callback("/\[quote\](.*?)\[\/quote\]/is", 
function($matches) 
{ 
    if (strlen($matches[1]) >= '1000') 
    { 
     $matches[0] = str_replace($matches[0], '<div class="box"><div class="collapse_container"><div class="collapse_header"><span>Long quote, click to expand</span></div><div class="collapse_content">' . $matches[1] . '</div></div></div>', $matches[0]); 
     return $matches[0]; 
    } 
}, $body); 

一些示例文本:

[quote]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[/quote] 

[quote]booohoo[/quote] 

[quote]new quoting[/quote] 

[b]test[/b] 
+0

只需推動'返回$比賽[0];'了'ìf'block之外。 –

+0

@Liam Dawe我是設計用於處理任何形式的短碼和BBCode的庫的作者。請看看,它肯定會幫助你的用例:https://github.com/thunderer/Shortcode。如果你需要任何幫助,只需要打開一個問題,我會幫你。 –

回答

3

你需要移動回$matches[0]代碼if塊外的列表:

function($matches) 
{ 
    if (strlen($matches[1]) >= '1000') { 
     $matches[0] = str_replace($matches[0], '<div class="box"><div class="collapse_container"><div class="collapse_header"><span>Long quote, click to expand</span></div><div class="collapse_content">' . $matches[1] . '</div></div></div>', $matches[0]); 
    } 
    return $matches[0]; 
} 

另外,我奉勸你展開懶惰匹配的正則表達式如下:

'~\[quote\]([^[]*(?:\[(?!/quote\])[^[]*)*)\[/quote\]~i' 

參見my regex demo(30步)和your regex demo(2025步)。

IDEONE demo

0

PHP的預浸*功能默認情況下采取行動的貪婪。它們將匹配由正則表達式描述的最長可能的字符串。在你的情況下,正則表達式會從第一個[quote]到最後一個[/ quote]。要打開這種行爲,你必須使用「U」修改器:

$body = preg_replace_callback("/\[quote\](.*?)\[\/quote\]/isU",...); 

對於修飾看到http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

這不起作用,因爲它與第一個[quote]匹配整個文本的最後一個[/ quote]。 – NaughtySquid

+0

你在誤讀'U'修飾符的作用。 PHP的正則表達式默認情況下不是「貪婪」的; '。*'默認情況下是貪婪的,'?'會讓它很懶。 'U'顛倒了'*'和'*?'配對。 – chris85

相關問題