|
|
|
| Нужно удалять оферквотинг из сообщений. При помощи регулярки.
Допустим есть такой текст
Тут тобиш начало текста
[quote=Саша]
Текст 1
[quote]Внутренняя e цитата 1[/quote]
Текст 2
[quote=Петя]Внутренняя q цитата 2[/quote]
Текст 3
[quote=Vaniya]Внутренняя [quote]Супер оферквотинг [/quote] цитат 3[/quote]
Это текст Саши
[/quote]
Это не в цитировании
|
А нужно чтобы получился.
Тут тобиш начало текста
[quote=Саша]
Текст 1
Текст 2
Текст 3
Это текст Саши
[/quote]
Это не в цитировании
|
То есть нужно удалять все вложенные цитаты.
Помчавшись пару дней и почитав разные темы, понял что напрямую нельзя сделать это регуляркой, нужно сначала изменить некоторый текст на один символ, который используется в отрицании.
/\x01(?=[^\x01]*\[\/quote\]).*?\[\/quote\]/
|
То есть для него я заменяю комбинацию на символ с кодом 01.
Но опять таки оно находит только самый нижний уровень вложенных цитат. Поэтому пришлось написать такую функцию
function DestroyOwerquote($Text){
$OldText = $Text;
$Text = str_replace('[quote', chr(01), $Text);
$Regular = '/\x01(?=[^\x01]*\[\/quote\]).*?\[\/quote\]/isum';
$Text = preg_replace($Regular, 'owerquoting', $Text);
$Text = str_replace(chr(01), '[quote', $Text);
if($Text!=$OldText){
$Text = DestroyOwerquote($Text);
}
return $Text;
}
|
Но она вообще получается убивает начисто цитирование.
Может кто подскажет как доработать эту регулярку
/\x01(?=[^\x01]*\[\/quote\]).*?\[\/quote\]/
|
чтобы она не трогала основное цитирование. А ещё лучше чтобы вообще без преобразования изначального текста работала. | |
|
|
|
|
автор: ..... (02.06.2011 в 07:04) |
|
|
для: mrsol
(01.06.2011 в 20:38)
| | Похоже на это http://forum.dklab.ru/viewtopic.php?p=159381 | |
|
|
|
|
|
|
|
для: .....
(02.06.2011 в 07:04)
| | В том варианте съедается верхний (родительский) тег [qoute который заменяется дивом. | |
|
|
|
|
автор: ..... (03.06.2011 в 00:10) |
|
|
для: mrsol
(02.06.2011 в 15:16)
| | Оберните в круглые скобки () части выражения совпадающие с [quo=...] и также с последующей последовательностью до [/quo]
, измените функцию примерно так
function unq($m){
global $r;
return $m[1] . preg_Replace($r, '', $m[2]) . '[/quo]';
}
и получится похоже
Принцип тот-же
, но такое работает только с правильно вложенными блоками.
В остальных случаях работает разбивка на любые из простейших составляюших блоков и последовательная обработка этих составляющих взависимости от порядка следования их разновидностей | |
|
|
|