Right-side

Рейтинг
13
Регистрация
26.02.2010

Ну вы прям издеваетесь, я и в первом сообщении конкретный вопрос задал, и потом дальше вообще конкретно реальную задачу привел, которую я решаю. А у вас абстракция...

Попробую еще раз.

[^()]+
- выбирает все, кроме скобок "(" и ")".

Вопрос: как записать похожий паттерн, чтобы исключать несколько конкретных последовательность символов, а не только две отдельные скобки. Например нужно исключать последовательности "вася" и "петя".

Теперь обсудим? :)

wwwwww, вопрос не поменялся, меня все еще интересует то, что написано в первом посте. Дальше я только уточняю контекст.

Мне все еще надо сделать записть аналогичную записи [^()], только в моем случае исключать конкретную последовательность символов, типа "{block}" или любую другую - это не важно.

Циклы всегда остаются запасным вариантов, от безисходности.

wwwwww, не знаю или не понимаю - потому и спрашиваю.

Хорс, и честно пытаюсь который день найти вариант решения, а не сижу и жду ответа. За это время "бороздения" информации узнал еще много нового, например рукурсивные паттерны :) Циклом я уже решил вопрос. Но это решение не особо нравится.

Лучше читать сразу мое предыдущее сообщение. Все это выше - для упрощения.

Вопрос не поменялся, но в предыдущем сообщении он в контексте конкретной проблемы.

Я польщён оживленностью в моей теме :)

Хорс, спасибо, что вы тратите свое время задавая такие подробные и разукрашенные вопросы :)

Так, значит, сейчас еще раз кое-что объясню, может быть и вопросы иссякнут.

Есть такая классная штука как рекурсивные регулярки: http://ua2.php.net/manual/en/regexp.reference.recursive.php

Вот ниже пример их работы:


$string = 'outside (one (two) one2) outside2 (three)';
$pattern = '@
\(
(
[^()]+
|(?R)
)*
\)
@sx';
preg_match_all($pattern, $string, $matches);
var_dump($matches);

Мой случай практически идентичен зи исключением того, что в этом примере тегами блоков являются скобки "(" и ")", а в моем случае - последовательности символов "{block}" и "{/block}". К слову говоря у них еще параметры есть, но не будем усложнять. По факту мне еще нужно будет дописать паттерн для разделителей типа {block $lala = $blabla}

Так вот, в примере в результате отработки паттерна мы получаем в результатах:


array
0 => (one (two) one2)
1 => (three)
Joker-jar:
Блоки со вложенными подблоками вообще не нужно обрабатывать или как?

Нужно, я это уже смогу сделать по той же схеме рекурсивно. Они у нас, как видите выше, в первом совпадении в массиве.

Ну и вот, проблема. Когда разделители скобки: в паттерне юзается [^()]+

Когда разделители {block} - хрен его знает как этот паттерн поправить, чтобы он отработал с тем же эфффектом. Вот и весь вопрос :)

Спасибо за вариант. Такая штука не пройдет. Дело в том, что этот паттерн, который мы тут можем гипотетически обнаружить, я собираюсь использовать в replace-функциях, потому мне такие разборы полетов не позволительны :)

По факту у меня текст из вложенных блоков, типа:

{block}в первом {block}во втором{/block} в первом{/block} вне блоков {block}опять в блоке{/block}

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

Так вот для правильного выбора того что мне нужно, в регулярке надо в одном месте перечислить в исключающем множестве открывающие и закрывающие теги блоков. Будь они одним символом, например (скобками):

(в первом (во втором) в первом) вне блоков (опять в блоке)

Все решается легко, потому что можно указать [^()]. И дело в шляпе. А у меня последовательность символов {block}, которую я не знаю как записать с тем же эффектом.

Наткнулся недавно на выражение: "Если у вас есть проблема и вы думаете, что ее можно решить через регулярные выражения, значит у вас уже есть две проблемы".

а. :)

Мне нужно игнорировать строки, которые содержат определенную последовательность символов. Работаю с PHP.

Есть конкретная задача, вопрос просто упрощен до минимума, чтобы найти "базу", от которой я дальше буду отталкиваться. Ну вот, например, тоже простой пример, но уже практический.

Есть строка: "собака обама акваланг абстракция апельсин".

Нужно выбрать все слова, за исключением тех, в которых присутствует последовательность символов "ба" и "ап".

В результате надо иметь совпадения: "собака обама акваланг апельсин абстракция".

Ближайший приходящий на ум вариант, это перечислить эти неугодные буквы в [^...], но в таком случае будут игнорироваться слова с любой из четырех перечисленных букв, а мне необходимы именно конкретные последовательности "ба" и "ап".