Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регулярка для удаления оверквотинга.
 
 автор: mrsol   (01.06.2011 в 20:38)   письмо автору
 
 

Нужно удалять оферквотинг из сообщений. При помощи регулярки.
Допустим есть такой текст

Тут тобиш начало текста
[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\]/

То есть для него я заменяю комбинацию
[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

  Ответить  
 
 автор: mrsol   (02.06.2011 в 15:16)   письмо автору
 
   для: .....   (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]';
}
и получится похоже
Принцип тот-же
, но такое работает только с правильно вложенными блоками.
В остальных случаях работает разбивка на любые из простейших составляюших блоков и последовательная обработка этих составляющих взависимости от порядка следования их разновидностей

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования