За последние 24 часа нас посетили 17050 программистов и 1834 робота. Сейчас ищут 1637 программистов ...

Регулярка с переносом строки

Тема в разделе "Регулярные выражения", создана пользователем Vladim, 10 мар 2017.

  1. Vladim

    Vladim Новичок

    С нами с:
    24 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Всем доброго времени суток!
    Возник вопрос по регулярному выражению.
    Есть текстовый файл. В нем персональные данные вида:

    1. Иванов Иван Иванович
    Менеджер
    ~a~Индекс
    Телефон
    Мобильный
    Факс
    E-mail
    website~b~

    2. Петров Петр петрович
    Бухгалтер
    ~a~Индекс
    Телефон
    Мобильный
    E-mail~b~

    После каждой строки идет перенос строки на новую.
    Вопрос! Как составить регулярное выражение, чтобы вытащить всю информацию между тегами ~a~ и ~b~(назовем их так), при условии, что количество строк везде разное.
    "/~a~(.*)вот_сюда_что~b~/"

    Заранее благодарю за помощь.
     
  2. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Нужно было добавить модификатор шаблона s,так как присутствуют символы перевода строки
    PHP:
    1. $str='Петров Петр петрович
    2. Бухгалтер
    3. ~a~Индекс
    4. Телефон
    5. Мобильный
    6. E-mail~b~';
    7. preg_match('/~a~(.*)~b~/s',$str,$match);
    8. print_r($match);
    Код (Text):
    1. Array
    2. (
    3.     [0] => ~a~Индекс
    4. Телефон
    5. Мобильный
    6. E-mail~b~
    7.     [1] => Индекс
    8. Телефон
    9. Мобильный
    10. E-mail
    11. )
     
  3. Vladim

    Vladim Новичок

    С нами с:
    24 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    PHP:
    1. $str='1. Иванов Иван Иванович
    2. Менеджер
    3. ~a~Индекс
    4. Телефон
    5. Мобильный
    6. Факс
    7. E-mail
    8. website~b~
    9.  
    10. 2. Петров Петр петрович
    11. Бухгалтер
    12. ~a~Индекс
    13. Телефон
    14. Мобильный
    15. E-mail~b~';
    16.  
    17. preg_match('/~a~(.*)~b~/s',$str,$match);
    18. echo '<pre>';
    19. print_r($match);
    20. echo '</pre>';
    А если идут подряд несколько блоков?
    Выражение выбирает с первого ~a~ по последнее ~b~.
    Нужно, чтобы отдельно было в массиве $match.
     
    #3 Vladim, 10 мар 2017
    Последнее редактирование: 10 мар 2017
  4. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    PHP:
    1. <?php
    2. $str='1. Иванов Иван Иванович
    3. Менеджер
    4. ~a~Индекс
    5. Телефон
    6. Мобильный
    7. Факс
    8. E-mail
    9. website~b~
    10. 2. Петров Петр петрович
    11. Бухгалтер
    12. ~a~Индекс
    13. Телефон
    14. Мобильный
    15. E-mail~b~';
    16. preg_match_all('/~a~(.*?)~b~/s',$str,$match);
    17. echo '<pre>';
    18. print_r($match);
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => ~a~Индекс
    6. Телефон
    7. Мобильный
    8. Факс
    9. E-mail
    10. website~b~
    11.             [1] => ~a~Индекс
    12. Телефон
    13. Мобильный
    14. E-mail~b~
    15.         )
    16.  
    17.     [1] => Array
    18.         (
    19.             [0] => Индекс
    20. Телефон
    21. Мобильный
    22. Факс
    23. E-mail
    24. website
    25.             [1] => Индекс
    26. Телефон
    27. Мобильный
    28. E-mail
    29.         )
    30.  
    31. )
     
  5. Vladim

    Vladim Новичок

    С нами с:
    24 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Огромное человеческое СПАСИБО!