PHP и с чем его едят....

dreamer

Member
Насколько я знаю такое сделать нельзя, результаты регекспов выдаются линейно а не иерархически, это вам не парсер :)
Если вас не устраивает использование двух регекспов предлагаю делать <(\w+)>([^<]*) и получать нечто вроди:
Код:
[ 'select', '' ],
[ 'option', 'value1' ],
[ 'option', 'value2' ],
[ 'select', '' ],
[ 'option', 'value3' ]
...
 

setty

Граф
в этому случае сложно сказать к какому селекту будет относится опция.
нужно чтоб опции были сгрупированы по разным массивам в зависимости от того какому они селекту принадлежат
 

dreamer

Member
в этому случае сложно сказать к какому селекту будет относится опция.
нужно чтоб опции были сгрупированы по разным массивам в зависимости от того какому они селекту принадлежат
Я прекрасно понимаю чего вы хотите, но такого не будет, если я не ошибаюсь.
А разбить опции по селектам совсем не сложно:

PHP:
foreach ($results as $result) {
    if ($result[0] == 'select')
        $select++;
    else
        $options[$select][] = $result[1];
}
 

setty

Граф
Если нет то, имхо, лучьше уж юзать два регекспа, из соображений наглядности кода.
Код:
	preg_match_all('~(?s)<select>(.*?)</select>~', $string, $aMatch);
	foreach($aMatch[1] as $select)
	{	preg_match_all('~(?s)<option>(.*?)</option>~', $select, $aMatch);
		$options[] = $aMatch[1];
	}
	return $options;
 

setty

Граф
Потому что я устанавливаю опцию PCRE_DOTALL (?s) (привычки ради), необходимо ограничивать жадность квантификатора *.
~(?s)<option>(.*)</option>~, вернет всего лишь один результат:
Код:
Array
        (
            [0] => big</option>
	<option>very big</option>
	<option>mega big
        )
Если бы этой опции не использовать, выражение ~<option>(.*)</option>~ работало б как ожидалось и квантификатор "знак вопроса" использовать не пришлось бы.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
У меня вопрос по регулярным выражениям.
Допустим имеется некоторый html код с несколькими select'ами каждый из который имеет любое кол-во опций(option tag):
Код:
<select>
	<option>something mysterious</option>
	<option>something more mysterious</option>
	<option>something just fucking crazy</option>
</select>
<select>
	<option>big</option>
	<option>very big</option>
	<option>mega big</option>
</select>
Хотелось бы распарсить его таким образом чтоб на выходе получить значения опций всех select'ов в качестве эллементов массива, причем чтоб кажому select'у соответствовал отдельный массив опций.
Другими словами на выходе ожидается что - то вроде такого:
Код:
Array
(
    [0] => Array
        (
            [0] => big
            [1] => very big
            [2] => mega big
        )

    [1] => Array
        (
            [0] => something mysterious
            [1] => something more mysterious
            [2] => something just fucking crazy
        )

)
Мне необходимо получить данные в таком виде чтоб в дальнейшем было удобно их обрабатывать.
Я решил задачу, однако мне приходится матчить два раза:
  • разделить код select'ов ~(?s)<select>.*?</select>~
  • пробегаясь по каждому матчу из предыдущего прега, получить массив опций ~(?s)<option>(.*?)</option>~
Вопрос в том, возможно ли решить задачу одним регулярным выражением? Реч идет именно о Perl-совместимых регулярных выражениях(PCRE).
Можешь разобрать <select></select>, а затем тем, что я давал по ><. Оно возвращает массив.
 

Max_145

New Member
Здраствуйте! ТОВАРИСЧЫ помогите. Не могу нигде найти ответ на вопрос.
Есть
$result = mysql_query("SELECT * FROM settings WHERE cat=' ВСЕМУ КРОМЕ 100'",$db);

В категории там циферки от 1 до 100. И нужно чтобы считывало все кроме 100.
Как такую штуку реализовать?
 
Зверху