PHP регулярное выражение для чтения выберите форму - PullRequest
2 голосов
/ 03 августа 2009

У меня есть исходный файл с формой выбора с некоторыми параметрами, например:

<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 и regex, но я не знаю как. У кого-нибудь есть идея? Было бы неплохо иметь массив с трехзначным кодом в качестве ключа и более длинную строку в качестве значения. (например, $ arr ['TWO'] == '2SK8')

Ответы [ 3 ]

5 голосов
/ 03 августа 2009
<?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
)
2 голосов
/ 03 августа 2009

Попробуйте это. Просто загрузите содержимое файла в $raw_html и используйте это регулярное выражение для сбора совпадений. Трехзначный код из опции $i th $out[i][1], а более длинная строка $out[i][2] При необходимости вы можете преобразовать это в ассоциативный массив.

$regex = '|<option value="(.{3})">([^<]+)</option>|';
preg_match_all($regex, $raw_html, $out, PREG_SET_ORDER);

print_r($out);
2 голосов
/ 03 августа 2009

Что-то вроде этого:

$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.
Если вы этого не сделаете, а формат опций не определен четко ... Ну, может быть, это может оказаться полезным добавить некоторые вещи в регулярное выражение, в качестве меры предосторожности ... (Например, принимать пробелы здесь и там, принимая другие атрибуты, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...