2015-11-14 3 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 Я являюсь автором библиотеки, предназначенной для обработки коротких кодов и любых BBCodes. Пожалуйста, взгляните, это определенно поможет вашему прецеденту: 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

PREG * функция ПГПСА действует жадную по умолчанию. Они будут соответствовать самой длинной строке, описываемой вашим регулярным выражением. В вашем случае регулярное выражение вычисляет все, начиная с первой [цитаты] до последней [/ quote]. Чтобы включить такое поведение, вы должны использовать «U» модификатор:

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

Для получения списка модификаторов см http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Это не работает, так как тогда он совпадает с первой [цитатой] до последней [/ quote] во всем тексте. – NaughtySquid

+0

Вы неправильно понимаете, что делает этот модификатор 'U'. Регулярные выражения PHP по умолчанию не являются «жадными»; '. *' жадно по умолчанию, '?' делает его ленивым. 'U' инвертирует пары' * 'и' *? '. – chris85

Смежные вопросы