регулярное выражение php для чтения формы выбора
У меня есть исходный файл с формой выбора с некоторыми параметрами, например:
<option value="TTO">1031</option><option value="187">187</option><option value="TWO">2SK8</option><option value="411">411</option><option value="AEL">Abec 11</option><option value="ABE">Abec11</option><option value="ACE">Ace</option><option value="ADD">Addikt</option><option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option><option value="ALG">Alligator</option><option value="ALM">Almost</option>
Я хотел бы прочитать этот файл с помощью php и регулярных выражений, но я действительно не знаю, как это сделать. У кого-нибудь есть идея? Было бы неплохо иметь массив с 3-значным кодом в качестве ключа и более длинной строкой в качестве значения. (так, например, $arr['ДВА']== '2SK8')
3 answers
<?php
$options= '
<option value="TTO">1031</option><option value="187">187</option><option value="TWO">2SK8</option><option value="411">411</option><option value="AEL">Abec 11</option><option value="ABE">Abec11</option><option value="ACE">Ace</option><option value="ADD">Addikt</option><option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option><option value="ALG">Alligator</option><option value="ALM">Almost</option>
';
preg_match_all( '@(<option value="([^"]+)">([^<]+)<\/option>)@', $options, $arr);
$result = array();
foreach ($arr[0] as $i => $value)
{
$result[$arr[2][$i]] = $arr[3][$i];
}
print_r($result);
?>
Вывод:
Array
(
[TTO] => 1031
[187] => 187
[TWO] => 2SK8
[411] => 411
[AEL] => Abec 11
[ABE] => Abec11
[ACE] => Ace
[ADD] => Addikt
[AFF] => Affiliate
[ALI] => Alien Workshop
[ALG] => Alligator
[ALM] => Almost
)
Как насчет чего-то вроде этого:
$html = <<<HTML
<option value="TTO">1031</option><option value="187">187</option>
<option value="TWO">2SK8</option><option value="411">411</option>
<option value="AEL">Abec 11</option><option value="ABE">Abec11</option>
<option value="ACE">Ace</option><option value="ADD">Addikt</option>
<option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option>
<option value="ALG">Alligator</option><option value="ALM">Almost</option>
HTML;
$matches = array();
if (preg_match_all('#<option\s+value="([^"]+)">([^<]+)</option>#', $html, $matches)) {
$list = array();
$num_matches = count($matches[0]);
for ($i=0 ; $i<$num_matches ; $i++) {
$list[$matches[1][$i]] = $matches[2][$i];
}
var_dump($list);
}
Вывод ($list
) будет следующим:
array
'TTO' => string '1031' (length=4)
187 => string '187' (length=3)
'TWO' => string '2SK8' (length=4)
411 => string '411' (length=3)
'AEL' => string 'Abec 11' (length=7)
'ABE' => string 'Abec11' (length=6)
'ACE' => string 'Ace' (length=3)
'ADD' => string 'Addikt' (length=6)
'AFF' => string 'Affiliate' (length=9)
'ALI' => string 'Alien Workshop' (length=14)
'ALG' => string 'Alligator' (length=9)
'ALM' => string 'Almost' (length=6)
Несколько пояснений:
- Я использую
preg_match_all
чтобы соответствовать как можно большему количеству раз -
([^"]+)
означает "все, что не является двойной кавычкой (так как это означало бы конецvalue
), по крайней мере, один раз и как можно больше раз (+
) -
([^<]+)
означает примерно то же самое, но с<
вместо"
в качестве конца маркер -
preg_match_all
даст мне массив, содержащий в$matches[1]
список всего, что соответствовало первому набору()
, и в$matches[2]
, что соответствовало второму набору()
- поэтому мне нужно повторить результаты, чтобы заново построить список, который вас интересует:-)
Надеюсь, это поможет - и что вы поняли, что это делает и как, чтобы вы могли помочь себе в следующий раз ;-)
В качестве примечания: использование регулярного выражения для "анализа" HTML как правило, это не такая уж хорошая идея... Если у вас есть полная HTML-страница, вы можете взглянуть на DOMDocument::loadHTML
.
Если вы этого не сделаете, и формат параметров не определен четко... Ну, может быть, будет полезно добавить кое-что в регулярное выражение в качестве меры предосторожности... (Например, принимать пробелы здесь и там, принимать другие атрибуты, ...)
Попробуйте это. Просто загрузите содержимое файла в $raw_html
и используйте это регулярное выражение для сбора совпадений. 3-значный код из опции $i
- это $out[i][1]
, а более длинная строка - $out[i][2]
. Вы можете преобразовать это в ассоциативный массив по мере необходимости.
$regex = '|<option value="(.{3})">([^<]+)</option>|';
preg_match_all($regex, $raw_html, $out, PREG_SET_ORDER);
print_r($out);