За последние 24 часа нас посетили 74273 программиста и 10170 роботов. Сейчас ищут 2413 программистов ...

Помогите разбить строку

Тема в разделе "Регулярные выражения", создана пользователем GlobalView, 21 июл 2010.

  1. GlobalView

    GlobalView Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    Есть исходная строка:

    Apple {Orange / Lemon} {Pineapple} Pear 1224 {lots of strawberries} {test string} {grapefruit 123}

    надо её разбить на составляюшие следующим образом:
    1) Apple
    2) Orange / Lemon
    3) Pineapple
    4) Pear
    5) 1224
    6) lots of strawberries
    7) test string
    8) grapefruit 123

    Т.е. каждое слово - новый элемент, но если группа слов стоит в круглых скобках {}, то эта группа является одним элементом.

    Можно ли это реализовать проще, чем использование str_replace много раз, о затем explode ?

    Спасибо!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    PHP:
    1. <?php
    2.  
    3. function purge($s)
    4. {
    5.     return trim(($s{0} == '{' && $s{strlen($s) - 1} == '}') ? substr($s, 1, -1) : $s);
    6. }
    7.  
    8. $s = 'Apple {Orange / Lemon} {Pineapple} Pear 1224 {lots of strawberries} {test string} {grapefruit 123}';
    9. $parts = preg_split('#(\{.+\})|(\s+)#U', $s, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
    10. $parts = array_filter(array_map('purge', $parts), 'strlen');
    11.  
    12. header('Content-type: text/plain');
    13. var_export($parts);
    результат
    Код (Text):
    1. array (
    2.   0 => 'Apple',
    3.   2 => 'Orange / Lemon',
    4.   4 => 'Pineapple',
    5.   6 => 'Pear',
    6.   8 => '1224',
    7.   10 => 'lots of strawberries',
    8.   12 => 'test string',
    9.   14 => 'grapefruit 123',
    10. )
     
  3. GlobalView

    GlobalView Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    Спасибо огромное!!!