Нужна помощь с регуляркой / PHP

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

Модераторы: xpert13
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Привет всем! Имеется следующий код
    Код:
    $str = '<select name="cat" style="width:300px;"><option value="0">Все категории</option><option value="10">Образование и наука</option></select>';
    
    preg_match_all('#<select name="cat"[^>]*><option[^>]*>(.*?)</option></select>#i',$str,$matches);
    В массиве $matches[1] получается один элемент "Все категорииОбразование и наука". Как подправить регулярку, чтобы "Все категории" и "Образование и наука" были отдельными элементами массива $matches[1]?

    Всем привет, я в регулярных выражениях не силен.
    Нужно заменить:

    Если предыдущий символ не "\\"(один слеш), тогда этот и следующий символ "\r\n" заменяем на "|"
    т.е.
    если "\r\n" заменить на "|"
    если "\\\r\n" ничего не заменять.

    Полагаю, что для знающего человека написать такое регулярное выражение займет 2 минуты.
    Напишите пожалуйста.
     
    Последнее редактирование модератором: 4 апр 2014
  2. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    Такого быть не должно, в $matches[1] по умолчанию содержится массив вхождений первой подмаски, $matches[2] второй, и так далее.
    http://www.php.net/manual/ru/function.preg-match-all.php
    Попробуйте установить флаг PREG_SET_ORDER:
    PHP:
    preg_match_all('#<select name="cat"[^>]*><option[^>]*>(.*?)</option></select>#i',$str,$matchesPREG_SET_ORDER);
    тогда структура массива $matches помняется

    upd: ааа, все понял! там ошибка в регулярке
    оно матчит текст
    Код:
    Все категории</option><option value="10">Образование и наука
    Нужно разбить его на 2 части - сначала получить сожержимое select'a, затем выдернуть значения option, во так:
    PHP:
    if(preg_match('#<select name="cat"[^>]*>(.*?)<\/select>#i',$str,$matches) ) {
        
    preg_match_all('#<option[^>]*>(.*?)<\/option>#i',$matches[1],$option_matches);
    }
     
    Последнее редактирование: 13 апр 2014
  3. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    по второму вопросу - eсли предыдущий символ не "\\"(один слеш), тогда этот и следующий символ "\r\n" заменяем на "|"
    PHP:
    $replaced_string preg_replace"/[^\\]{1}\\r\\n/i"'|'$string);