Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Помогите составить регулярное выражение, пожалуйста.
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2008
Помог: 0 раз(а)
Здравствуйте!
Встал довольно срочный вопрос. В общем никак немогу составить правильно регулярное выражение на PHP.
Суть такая.
Есть некое количество переменных значений в фиг. скобках, в свою очередь в этих скобках могут быть ещё фигурные скобки. Таким образом, получается вложеннось. Но вложенность не может быть больше 1-го уровня, что естественно задачу облегчает. НО. Принципиально важно, чтобы в фиг. скобках вложенными были только фиг. скобки, а не какие другие делимиторы.
Вот пример исходной строки:
Основное {Значение 1|Значение 2|Значение 3 {Значение 3.1|Значение 3.2|Значение 3.3|} Значение 4{Значение 4.1|Значение 4.2|Значение 4.3|} Значение 5} Основное 2
Суть в том, что мне нужно получть отдельно:
- {Значение 1|Значение 2|Значение 3
- {Значение 3.1|Значение 3.2|Значение 3.3|}
- Значение 4
- {Значение 4.1|Значение 4.2|Значение 4.3|}
- Значение 5
и потом уже дальше с ними манипулировать.
Пробую preg_match_all("~\{(.*)\}~isU", $stroka, $fVarsArray, PREG_PATTERN_ORDER)
Где $stroka - исходная строка, $fVarsArray - массив того, что находит.
Но находит не то.
Вместо 1-го значения оно мне выдаёт {Значение 1|Значение 2|Значение 3 {Значение 3.1|Значение 3.2|Значение 3.3|}, а не {Значение 1|Значение 2|Значение 3
Подскажите, как мне быть.
scuter
Отправлено: 17 Февраля, 2008 - 02:06:08
Посетитель
Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2008
Эти интересные функции я знаю прекрасно Но они мне здесь не помогут (хотя в целом в проге применяются)
Я же писал конкретно что нужно:
Цитата:
Суть в том, что мне нужно получть отдельно:
- {Значение 1|Значение 2|Значение 3
- {Значение 3.1|Значение 3.2|Значение 3.3|}
- Значение 4
- {Значение 4.1|Значение 4.2|Значение 4.3|}
- Значение 5
и потом уже дальше с ними манипулировать.
А как составить рег. выр., ну не въеду уже 2-й день. Просто логически немогу догадаться. Как можно скрипту объяснить - где у открывающейся скобки именно её закрывающая, а не первая попавшаяся по строке?..
Самое интересное - это же как-то реализовано в той же моей любимой Zend Studio: ставишь курсор перед скобкой а он тнбн ПРАВИЛЬНО определяет её закрывающую (или наоборот). Это не к тому, что я хочу интерпретатор ПХП на ПХП писать, просто суть похожая.
evgenijj
Отправлено: 17 Февраля, 2008 - 17:47:48
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2008
Помог: 0 раз(а)
evgenijj
Спасибо!
Однако это немного не то. Возможно я просто неправильно или как-то непонятно объяснил.
С Вашим кодом получается так, что если в исходное значение добавить ещё переменных в скобках, то уже ничего не работает правильно.
Просто в задаче заранее неопределено - сколько будет в тексте вхождений скобок с вложенными скобками (и сколько в них будет вложенных) и сколько обычных 1-го уровня.
Я решил всетаки эту задачу, однако без регулярных выражений вообще. Чисто на элементарных функциях PHP. Однако может я и неправильно поступил.
Но самое главное, всё работает!
Вот код:
$msclpos=strpos($text,'}');//Находим позицию 1-й }
//Если между откр (::main~ и найденым } количество откр. равно кол-ву закр. подскобок, то принимаем за главную и закрываем (заменяем на усл. знак.), если нет то дальше
$text=substr_replace($text,'~sub::)',$msclpos, 1);//Заменяем } на ~main::)
}
}
echo'<b>'.$text.'<br>';
Но сразу оговорюсь, что он только часть функции выполняет, а именно делает отличие между вложенными скобками и скобками 1-го уровня. Это самое главное было. А когда они различны - уже просто дальше их выделить, и выделить все значения из них.
Спасибо за внимание и ответы!!!
P.S. Не серчайте, что код кривоватый. Пол ночи писал, и спать ужо охота!!!
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.