Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Выбор "все кроме"


Автор: kapusta 6.8.2006, 19:41
Помогите составить регулярку для такого примера.

Код

[B]строка длинная[/B] //надо выбрать
[QUOTE]строка длинная[/QUOTE] //пропускаем


Т.е. регулярка должна выбирать все теги, кроме некоторых, попадающих в список исключений.

Автор: Добряк 6.8.2006, 22:08
При таком раскладе:
Код

<?php

$str = '[B]строка длинная[/B][QUOTE]строка длинная[/QUOTE]<b><script>';
ereg_replace("[^0-9a-zA-Z_]", "", $str);
echo $str;

?>

Выводит на экран:
Код

[B]строка длинная[/B][QUOTE]строка длинная[/QUOTE]

Вы это просили? А то как-то не совсем понятно...

Автор: kapusta 6.8.2006, 22:15
Не совсем.

Вот текст.
Код

Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE] вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.


Восле обработки регэкспом требуется получить только определенные теги вместе с их содержимым. Т.е. выделяем все теги, кроме некоторых. В данном примере, не нужно выделять [QUOTE] и [LOL]. Все остальные нужны.
Код

[B]строка длинная[/B]
[U]строка длинная[/U]

Автор: check 6.8.2006, 22:40
Может так?
Код

/\[[^QUOTE|LOL]\].*?\[\/[^QUOTE|LOL]\]/i

Автор: Добряк 7.8.2006, 00:09
Ух, ёмана! У меня вот так только заработало:
Код

<?php

$str = 'Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE]
        вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.';
$str = preg_replace("/\[LOL\](.*?)\[\/LOL\]|\[QUOTE\](.*?)\[\/QUOTE\]/i", "", $str);
echo $str;

?>

Наверное, есть более лучшие варианты, но я их не знаю  smile .

Автор: GiV 9.8.2006, 10:58
Или исходя из задания так:
Код

$txt = 'Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE]
        вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.';
$txt = preg_match_all( "~\[(?:b|u|i)\].+?\[/(?:b|u|i)\]~is", $txt, $matches );

print_r($matches);

Автор: kapusta 9.8.2006, 19:15
Спасибо за помощь, но все это не то. Не работают так, как того требует условие задачи.

Неужели никто не знает, как подобное организовать? Или подобной возможности в регэкспах нет в принципе?

Автор: Добряк 9.8.2006, 21:20
Код

<?php

$txt = 'Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE]
        вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.';
$txt = preg_match_all( "~\[(?:b|u|i)\].+?\[/(?:b|u|i)\]~is", $txt, $matches );

print_r($matches[0][0].$matches[0][1]);

?>

Так подойдёт?

Автор: kapusta 10.8.2006, 22:12
Добряк, твой регэксп выбирает только теги b, u и i. А мне надо немного другое. выбирать не заданные теги, а все, кроме заданных.

Автор: Добряк 10.8.2006, 22:20
Цитата(kapusta @ 10.8.2006,  23:12)
Добряк, твой регэксп выбирает только теги b, u и i. А мне надо немного другое. выбирать не заданные теги, а все, кроме заданных.

Ну тогда чем не подошёл мой прошлый пример?
Код

<?php

$str = 'Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE]
        вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.';
$str = preg_replace("/\[LOL\](.*?)\[\/LOL\]|\[QUOTE\](.*?)\[\/QUOTE\]/i", "", $str);
echo $str;

?>

Здесь выбирается всё, кроме содержимого заданных тегов (LOL и QUOTE). smile 

Автор: kapusta 12.8.2006, 23:05
Это тоже не совсем то. У тебя просто с помощью этого регэкспа вырезаются эти 2 тега, а остальные остаются.

Автор: GiV 14.8.2006, 12:47
Цитата(kapusta @  12.8.2006,  23:05 Найти цитируемый пост)
Это тоже не совсем то. У тебя просто с помощью этого регэкспа вырезаются эти 2 тега, а остальные остаются. 

ну так совмести два варианта.

Код

$txt = 'Например, строка [B]строка длинная[/B] бла-бла-бла [QUOTE]строка длинная[/QUOTE]
        вот текст [U]строка длинная[/U]  еще текст [LOL]строка длинная[/LOL]  ну и конец.';
$txt = preg_replace('/\[LOL\](.*?)\[\/LOL\]|\[QUOTE\](.*?)\[\/QUOTE\]/i', '', $txt);
$txt = preg_match_all( "~\[(?:[a-z]+)\].+?\[/(?:[a-z]+)\]~is", $txt, $matches );

print_r($matches);


Автор: check 27.8.2006, 18:29
Что-то автор молчит, проблема решена или нет? 
По-моему нет,  ведь не требовалось вырезать из строки теги QUOTE и LOL.

Автор: ewolf 27.8.2006, 22:44
Возможно, автору это уже не нужно, но кому-то другому пригодится.

Можно сделать так:

Код

<?php
    $exclude_list = array( 'QUOTE', 'CODE', );

    $exclude = implode('|', $exclude_list);

    $reg_exp = '/(?(?=\[('.$exclude.')\]).*?\[\/\1\]|\[(.*?)\](.*?)\[\/\2\])/mi';
    
    $str = '[B]строка ddd длинная[/B] //надо выбрать 
    [QUOTE]строка длинная[/QUOTE] [I]курсив[/I] //пропускаем';
    
    preg_match_all($reg_exp, $str, $matches, PREG_SET_ORDER);
    
    print_r($matches);
?>


Делает именно то, что хочет автор

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)