preg exp help

Статус
В этой теме нельзя размещать новые ответы.

panika

Новичок
HTML:
[level>0]Вы авторизованы[/level]
PHP:
$source = preg_replace( "#\[level([^\[\]]*?)\](.*?)\[\/level\]#ie", "\$this->level_blocks('\\2','\\1')", $source );
preg_replace не находит блок [level][/level]
Вчера весь день над этим мучался :(

Кто хорошо разбирается в регулярных выражениях помогите.
з.ы. Не спрашивайте меня зачем мне это, на одном форуме нашелся умник, таких много.
 

panika

Новичок
http://weitz.de/regex-coach/
хорошая программка, и задачу сформулируй конкретнее, а то не понятно что заменить тебе нужно
Честно говоря я не понял как она работает, даже зная немного английского я так и не смог ничего сделать.
Задача: [level( все? но не [ или ] )]( все )[/level]
 

panika

Новичок
Разобрался, она говорит что мой код валиден, только на практике он не работает.
 

phprus

Moderator
Команда форума
panika
У тебя ограничители #, по этому ты экранируешь лишние символы. Кроме того лучше использовать preg_replace_callback, а то будет потенциальный php-injection.
 

panika

Новичок
panika
У тебя ограничители #, по этому ты экранируешь лишние символы. Кроме того лучше использовать preg_replace_callback, а то будет потенциальный php-injection.
расскажите поподробнее пожалуйста,
и еще хотелось бы услышать как сделать чтобы в области (.*?) вычиталось \[\/level\]

мне нужно что-то вроде
PHP:
<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function parseTagsRecursive($input)
{

    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;
?>
 

panika

Новичок
Сутки еще не закончились и еще не факт что завтра я закончу пускать на клавиатуру свои мозги, поэтому помогите люди добрые.

Допустим имеется такая строка:
HTML:
[level] Уровень 1 [level] Уровень 2  [level] Уровень 3 [level] Уровень 4  [/level]  [/level] [/level] [/level]
Мне нужно чтобы первое что он обработал это всю строку: Уровень 1 [level] Уровень 2 [level] Уровень 3 [level] Уровень 3 [/level] [/level] [/level]
Далее: Уровень 2 [level] Уровень 3 [level] Уровень 3 [/level] [/level]
Далее: Уровень 3 [level] Уровень 4 [/level]
Далее: Уровень 4

И на этом закончился цикл регулярных преобразований.
 

Ragazzo

TDD interested
тебе нужно получить только "Уровень 4" ? или все промежуточные тоже?
 

Вурдалак

Продвинутый новичок
Как же задрали с этими регулярными выражениями. Работай с массивом
PHP:
$tokens = preg_split('#(\\[/?level\\])#', $src, -1, PREG_SPLIT_DELIM_CAPTURE);
Нечётные индексы — теги, чётные — текст.
 

panika

Новичок
тебе нужно получить только "Уровень 4" ? или все промежуточные тоже?
вообще в начале тега есть условие например [level>0] и в зависимости от условия я удаляю тег или одобряю.

Как же задрали с этими регулярными выражениями. Работай с массивом
PHP:
$tokens = preg_split('#(\\[/?level\\])#', $src, -1, PREG_SPLIT_DELIM_CAPTURE);
Нечётные индексы — теги, чётные — текст.
Возьму на заметку, НО это все равно не то.
 

Вурдалак

Продвинутый новичок
panika, конечно это не то. Это только общая идея. Я готовый код писать бесплатно не буду.
 

panika

Новичок
panika, конечно это не то. Это только общая идея. Я готовый код писать бесплатно не буду.
Вы мне предлагаете из логически неправильного массива, выдергивать на угад теги и текст? - Это извращение чистейшей воды, и вы думаете я оценил ваше сообщение? - Это все риторические вопросы.

Извиняюсь за всплеск эмоций, у меня из-за регулярных выражений нервов не хватает, я стараюсь уважительно с вами разговаривать но когда появляются такие кадры как ты меня это выводит из колеи.
 

Вурдалак

Продвинутый новичок
Что такое «логически неправильный массив»? Наугад там делать ничего не надо: я чёрным по белому написал, что в нечётных индексах находятся теги, а в чётных — текст. Всё вполне определённо.
 

panika

Новичок
Что такое «логически неправильный массив»? Наугад там делать ничего не надо: я чёрным по белому написал, что в нечётных индексах находятся теги, а в чётных — текст. Всё вполне определённо.
PHP:
$source = "[level<1]2[level>0]Вы авторизованы[/level]232134[/level]";
$tokens = preg_split('#(\\[/?level([^\]]*?)\\])#', $source, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($tokens);
Выводит:
Код:
Array
(
    [0] => 
    [1] => [level<1]
    [2] => <1
    [3] => 2
    [4] => [level>0]
    [5] => >0
    [6] => Вы авторизованы
    [7] => [/level]
    [8] => 
    [9] => 232134
    [10] => [/level]
    [11] => 
    [12] => 
)
В получившимся массиве нет никакой логики, чтобы можно было использовать в моих целях.
 

Вурдалак

Продвинутый новичок
Это из-за лишних скобок внутри паттерна. Но тут можно ещё проще:
PHP:
$tokens = preg_split('#(\\[/?level.*?\\])#', $source, -1, PREG_SPLIT_DELIM_CAPTURE);
Код:
Array
(
    [0] => 
    [1] => [level<1]
    [2] => 2
    [3] => [level>0]
    [4] => Вы авторизованы
    [5] => [/level]
    [6] => 232134
    [7] => [/level]
    [8] => 
)
 

panika

Новичок
Это из-за лишних скобок внутри паттерна. Но тут можно ещё проще:
PHP:
$tokens = preg_split('#(\\[/?level.*?\\])#', $source, -1, PREG_SPLIT_DELIM_CAPTURE);
Что если строка длинная, мне же потом нужно будет циклом собирать каждый ключ массива с последующей его обработкой, это на сколько напряжется тачка?
 

craz

Нестандартное звание
Извиняюсь за всплеск эмоций, у меня из-за регулярных выражений нервов не хватает, я стараюсь уважительно с вами разговаривать но когда появляются такие кадры как ты меня это выводит из колеи.
по теме: регулярки это просто как 42(извините за споли), и не требуют никаких нервов.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху