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

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
Привет всем! Имеется следующий код
Код:
$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 минуты.
Напишите пожалуйста.
 
Последнее редактирование модератором:
В массиве $matches[1] получается один элемент "Все категорииОбразование и наука". Как подправить регулярку, чтобы "Все категории" и "Образование и наука" были отдельными элементами массива $matches[1]?
Такого быть не должно, в $matches[1] по умолчанию содержится массив вхождений первой подмаски, $matches[2] второй, и так далее.
Для просмотра ссылки Войди или Зарегистрируйся
Попробуйте установить флаг PREG_SET_ORDER:
PHP:
preg_match_all('#<select name="cat"[^>]*><option[^>]*>(.*?)</option></select>#i',$str,$matches, PREG_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);
}
 
Последнее редактирование:
по второму вопросу - eсли предыдущий символ не "\\"(один слеш), тогда этот и следующий символ "\r\n" заменяем на "|"
PHP:
$replaced_string = preg_replace( "/[^\\]{1}\\r\\n/i", '|', $string);
 
Назад
Сверху