-1

重複の可能性:
PHP で HTML を解析および処理する方法は?

トラフを検索してこの種のデータを取得する必要があるコードがたくさんあります

<span class="parameter-name-value">
    <span class="parameter-name">....</span> 
    <span class="parameter-value">....</span>
</span>

の形式でPHP配列に

$array = array(
    array("parameter-name", "parameter-value"),
    array("parameter-name", "parameter-value"),
    array("parameter-name", "parameter-value")
)

どのような正規表現が必要ですか?

4

3 に答える 3

1

データが提示したとおりに表示され、変更されないことがわかっている場合は、正規表現を使用する方が、XMLライブラリをロードするよりも高速で簡単です。ただし、これが失敗するために変更する必要はあまりないことに注意してください。XMLパーサーソリューションははるかに堅牢です。

$data = '<span class="parameter-name-value">
    <span class="parameter-name">A</span>
    <span class="parameter-value">x</span>
</span>
<span class="parameter-name-value">
    <span class="parameter-name">B</span>
    <span class="parameter-value">y</span>
</span>
<span class="parameter-name-value">
    <span class="parameter-name">C</span>
    <span class="parameter-value">z</span>
</span>
';

$pattern = '@<span class=\"parameter-name-value\">
    <span class=\"parameter-name\">(.*)</span>
    <span class=\"parameter-value\">(.*)</span>
</span>@';

preg_match_all($pattern, $data, $matches);
list($_, $keys, $values) = $matches;
$result = array_combine($keys, $values);
print_r($result);

出力

Array
(
    [A] => x
    [B] => y
    [C] => z
)
于 2012-10-25T15:04:19.177 に答える
1

これがあなたのセットアップになります:

function get_tags($string, $start, $end)
{
    $start = str_replace("\\", "\\\\", $start);
    $start = str_replace("/", "\/", $start);
    $end   = str_replace("\\", "\\\\", $end);
    $end   = str_replace("/", "\/", $end);
    preg_match_all("/{$start}(.*?){$end}/si", $string, $matching_data);
    return $matching_data[0];
}

function return_between($string, $start, $stop, $type)
{
    $temp = split_string($string, $start, false, $type);
    return split_string($temp, $stop, true, $type);
}

function get_attribute($tag, $attribute)
{   
    // Remove all line feeds from the string
    $cleaned_html = str_replace("\r", "", $tag);   
    $cleaned_html = str_replace("\n", "", $cleaned_html);

    // Use return_between() to find the properly quoted value for the attribute
    return return_between($cleaned_html, $attribute."=\"", "\"", true);
}

それを使用するには、次のようにします。

$open_tag = '<span';
$close_tag = '>';

$span_tags = get_tags($html_string, $open_tag, $close_tag);
$span_tag_class_names = array();

foreach ($span_tags as $key => $tag) {
    $class_name = get_attribute($tag, $attribute = "class");
    if (!empty($class_name)) {
        $span_tag_class_names[] = $class_name;
    }
}

print_r($span_tag_class_names);

すべての正規表現と同様に、マイレージは異なる場合があります。

于 2012-10-25T14:50:39.947 に答える
0

あなたHTMLは明確ではありませんがDOMDocument、形式に関係なく使用できます

$html = '<span class="parameter-name-value">
    <span class="parameter-name">A</span> 
    <span class="parameter-value">1</span>
</span>
<span class="parameter-name-value">
    <span class="parameter-name">B</span> 
    <span class="parameter-value">2</span>
</span>';

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$span = $xpath->query("//span/span");

    $dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$span = $xpath->query("//span/span");

$list = array();
$list2 = array();

for($i = 0; $i < $span->length; $i += 2) {
    $name = $span->item($i);
    $value = $span->item($i + 1);
    $list[] = array($name->getAttribute('class') => $name->nodeValue,$value->getAttribute('class') => $value->nodeValue);
    $list2[] = array($name->getAttribute('class'),$value->getAttribute('class'));
}

var_dump($list);
var_dump($list2);

出力$list

array
  0 => 
    array
      'parameter-name' => string 'A' (length=1)
      'parameter-value' => string '1' (length=1)
  1 => 
    array
      'parameter-name' => string 'B' (length=1)
      'parameter-value' => string '2' (length=1)

出力$list2

array
  0 => 
    array
      0 => string 'parameter-name' (length=14)
      1 => string 'parameter-value' (length=15)
  1 => 
    array
      0 => string 'parameter-name' (length=14)
      1 => string 'parameter-value' (length=15)
于 2012-10-25T14:54:40.697 に答える