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
Форумы портала PHP.SU :: Версия для печати :: Как вытащить текст из скобок
Форумы портала PHP.SU » PHP » Регулярные выражения » Как вытащить текст из скобок

Страниц (1): [1]
 

1. ander - 07 Февраля, 2021 - 00:53:20 - перейти к сообщению
Доброе время суток.
Есть вопрос, который не получается решить. Нужно разбить регуляркой строку, вернее вытащить весь текст из скобок и того, что между ними, не перепутав.
Предположим есть текст – [однажды]+в+студеную, зимнюю пору+{я из леса вышел}+был сильный мороз,+[гляжу поднимается]+медленно в гору+{лошадка везущая}+хворосту воз+.
Как можно вытащить все куски предложения с помощью одной регулярки, одного паттерна?
2. Строитель - 07 Февраля, 2021 - 23:20:20 - перейти к сообщению
ander,
PHP:
скопировать код в буфер обмена
  1. $str = '[однажды]+в+студеную, зимнюю пору+{я из леса вышел}+был сильный мороз,+[гляжу поднимается]+медленно в гору+{лошадка везущая}+хворосту воз+';
  2.  
  3. ! preg_match_all('~\pL+~u', $str, $arr) ?: $str = join(' ', $arr[0]);
  4.  
  5. echo $str;
3. ander - 10 Февраля, 2021 - 08:06:23 - перейти к сообщению
Строитель пишет:
ander
Здравствуйте. Круто!!! Радость Все работает и как просто..
Спасибо большое!

(Добавление)
Все супер, а как доработать эту регулярку, чтобы вытаскивать из скобок в массив другую строку -
PHP:
скопировать код в буфер обмена
  1. $str = '[однажды|Вот как то|Зимою наверно]+в+студеную,+зимнюю|летнюю|мокрую|сизую+пору+{я из+леса|кустов|куста+выполз|вылез|вышел}+был+сильный|жуткий|должный+мороз,+[гляжу+поднимается|забирается|выпрямляется]+медленно|быстренько|муторно+в гору+{лошадка|кобылка+везущая|тащащая}+хворосту|кустиков+воз+';
  2.      
  3.     preg_match_all('~\pL+~u', $str, $arr) ?: $str = join(' ', $arr[0]);
  4.      
  5.     echo $str;
  6.         echo '<br/>------------<br/>';
  7.         var_dump($arr[0]);


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

Я в свое время пробовал что-то типа -
PHP:
скопировать код в буфер обмена
  1. preg_match_all('~[условие]?|условие?|{условие}?+~u', $str, $arr);


То есть ставил в паттерне разделитель "|" между условиями, но ничего не получалось, скрипт либо брал только первое условие, либо последнее..
В общем переломав кучу копий я успокоился..
4. Строитель - 10 Февраля, 2021 - 10:44:28 - перейти к сообщению
ander, не понятно, что именно нужно получать в результате. Напишите примеры результатов, которые нужно получить из исходной строки.
5. ander - 10 Февраля, 2021 - 16:20:46 - перейти к сообщению
Строитель пишет:
ander, не понятно, что именно нужно получать в результате. Напишите примеры результатов, которые нужно получить из исходной строки.


Хотелось бы получить структуру массива $arr, следующего вида:
PHP:
скопировать код в буфер обмена
  1.  
  2. [0] => однажды|Вот как то|Зимою наверно
  3. [1] => в+студеную,+зимнюю|летнюю|мокрую|сизую+пору
  4. [2] => я из+леса|кустов|куста+выполз|вылез|вышел
  5. [3] => был+сильный|жуткий|должный+мороз,
  6. [4] => гляжу+поднимается|забирается|выпрямляется
  7. [5] => медленно|быстренько|муторно+в гору
  8. [6] => лошадка|кобылка+везущая|тащащая
  9. [7] => хворосту|кустиков+воз
6. Строитель - 10 Февраля, 2021 - 22:48:40 - перейти к сообщению
ander, писал с телефона
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $str = '[однажды|Вот как то|Зимою наверно]+в+студеную,+зимнюю|летнюю|мокрую|сизую+пору+{я из+леса|кустов|куста+выполз|вылез|вышел}+был+сильный|жуткий|должный+мороз,+[гляжу+поднимается|забирается|выпрямляется]+медленно|быстренько|муторно+в гору+{лошадка|кобылка+везущая|тащащая}+хворосту|кустиков+воз+';
  4.      
  5. preg_match_all('~(?: \[[^]]+\] | \{[^}]+\} | \+[^[{]+\+ )~x', $str, $arr);
  6.  
  7. $arr = array_map(function($s){
  8.     return trim($s, '[]{}+');
  9. }, $arr[0]);
  10.  
  11. var_dump($arr);

См. демо https://3v4l[dot]org/q8n2L
7. ander - 14 Февраля, 2021 - 15:56:04 - перейти к сообщению
Строитель пишет:
ander, писал с телефона


Настоящий мастер может писать даже на песке Радость

Спасибо! Попробовал все вроде так как я хотел, теперь попробую обработать полученный массив, самое главное я знаю куда обратится за помощью!
8. Строитель - 14 Февраля, 2021 - 21:47:40 - перейти к сообщению
ander, давно же вас не было )
9. ander - 09 Марта, 2021 - 06:45:37 - перейти к сообщению
Строитель пишет:
ander, давно же вас не было )

Да бывает езжу и забываю заходить на ваш замечательный форум.. Радость

 

Powered by ExBB FM 1.0 RC1