[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PREG_SET_ORDER
vestmar
Добрый день! регулярки вроде знаю хорошо, но не понял "условия" в них, вот первый раз в ступоре:

$a = "{{Вася|Петя} {идёт|пошёл} в магазин|{Василий|Петр} {{пешком сходил}{на своих двоих}|сбегал} в магазин}";



preg_match_all('!__не знаю как составить___!s',$a,$b,PREG_SET_ORDER);


надо занести в $b[] всю строку
а так же в:
[1] = > {Вася|Петя} {идёт|пошёл} в магазин
[2] = > {Василий|Петр} {{пешком сходил}{на своих двоих}|сбегал} в магазин}

т.е. как я понимаю регулярка должна найти первую "{" потом смотреть если "{"-открылось, встретила несколько "|" потом закрылась "}", то это пропускаем, идём дальше, ещё не сколько раз такое выражение, идём дальше и тут одиноко стоящая "|" вот до этого знака и загоняем в массив.

то же сделать со следующим значением $a, в общем мне нужна нормально работающая схема разбивки на две части этой штуки..
Спасибо!
DedMorozzz
(вариант1|вариант1)

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
vestmar
Цитата (DedMorozzz @ 5.09.2014 - 17:42)
(вариант1|вариант1)

не много не то, вот составил примерно, \{(\{.*?\}[^{,|]*)(\{.*?\}[^{,|]*)+ вроде выбирает первую часть, без условий, я на правильном пути?
DedMorozzz
я тебя не понимаю. Каков начальный и конечный результаты?

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
vestmar
вот что вышло

$a = "{{Вася|Петя} {идёт|пошёл} в магазин|{Василий|Петр} {{пешком сходил}{на своих двоих}|сбегал} в магазин}";

preg_match_all('!^(\{(\{.*?\}[^{,|]*)+)\|(.*)!s',$a,$b,PREG_SET_ORDER);

Array
(
[
0] => Array
(
[
0] => {{Вася|Петя} {идёт|пошёл} в магазин|{Василий|Петр} {{пешком сходил}{на своих двоих}|сбегал} в магазин}
[1] => {{Вася|Петя} {идёт|пошёл} в магазин
[2] => {идёт|пошёл} в магазин
[3] => {Василий|Петр} {{пешком сходил}{на своих двоих}|сбегал} в магазин}
)

)


[1] и [3] меня вполне устраивает! но возможны варианты что предложений про Васю будет несколько через "|", каждый рассказывает маленькую историю о Васи,

мне надо что бы они все занеслись попорядку в
[1]
[2]
[3]
и тд,
Спасибо!
DedMorozzz
Т.е. тебе необходимо выцепить из строки кусок, с любым кол-вом условий до |, который(разделитель) будет только в 1м уровне скобок(всё предложение в них взято)
Правильно тебя понял?

Т.е. из строки вида:
{aaaa {bbb|ccc} ddd {eee|fff} {ggg|hhh} | iiii {jjj | kkk} lll {mmm | nnn } {ooo | pppp} | qqq {rrr | sss}}

выбрать 3 части:
- aaaa {bbb|ccc} ddd {eee|fff} {ggg|hhh}
- iiii {jjj | kkk} lll {mmm | nnn } {ooo | pppp}
- qqq {rrr | sss}


Так?

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
vestmar
да, это будет одна строка, она будет разделена на несколько через |, и надо выцепить их
Спасибо за помощь!)
DedMorozzz
Отредактировал пост выше. Посмотри его. Правильно всё расписал?

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
vestmar
Именно!!!!!!! Здорово)
DedMorozzz
Ок, освобожусь и напишу код

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
DedMorozzz
Сходу не удалось придумать чё нить супер простоe, держи так:

$a = 'aaaa {bbb|ccc} ddd {eee|fff} {ggg|{hhh|hhh1}} | iiii {jjj | kkk} lll {mmm | nnn } {ooo | pppp} | qqq {rrr | sss}';
preg_match_all('#{.*?}#u',$a,$matches);

$b = preg_replace('#{.*?}#','%replace%',$a);
$b = str_replace('|','%|%',$b);
$matches = $matches[0];
foreach($matches as $match){
$b = preg_replace('#\%replace\%#u', $match, $b, 1);
}
$result = explode('%|%',$b);
echo "<pre>";print_r($result);echo "</pre>";die;


Какова тут логика - учитывая, что кол-во элементов может быть разным - отталкиаться надо только от "чистых" резделителей. Для этого убираем все фигурные скобки.
В оставшейся строке все | отделяем неким образом(в данном случае сделал процентами). Далее возвращаем весь контент в фигурных скобках и получившуюся строку бьём по процентам (%|%)

Так же сделал возможной абсолютно любую вложенность. К примеру так - {ggg|{hhh|hhh1}}

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
vestmar
Добрый вечер! Не знаю как Вас благодарить! Вы даже о вложенности позаботились, Всё здорово, но придётся составлять текст под скрипт а прога вложенные условия делает случайно,

пошёл Вася {в клуб {тусить|отрываться}|в лес {по грибы|по ягоды}}|другие предложения ...

результат:
Array
(
[
0] => {в клуб {тусить|отрываться}
[1] => в лес {по грибы|по ягоды}}
)



Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.