0

私はphpが初めてで、preg_match_allを使用してURLからデータを抽出しようとしています

問題は、一致が文字列に変換され、それらを個別に抽出できないことです

<?php
$pattern = '/<span class="product".*/i';
$string = file_get_contents('http://www.example.com/');

preg_match_all($pattern, $string, $matches);
echo '<b>preg_match_all()</b>';
echo '<pre>';
echo '<br /><b>Products:</b> ', var_dump($matches);
echo '</pre>';

戻り値

preg_match_all()

Products: array(1) {
  [0]=> array(7) {
      [0] => string(46) "Product 1"
      [1] => string(42) "Product 2"
      [2] => string(46) "Product 3"
      [3] => string(41) "Product 4"
      [4] => string(58) "Product 5"
      [5] => string(42) "Product 6"
      [6] => string(37) "Product 7"
  }
}

一度に 1 つの項目 (要素を分離) を抽出し、可能であればそれぞれを独自の変数に配置しようとしています。例: $product1 = "製品 1"

echo $matches[2];製品 3 を取得しようとすると、未定義のオフセット エラーが発生します

編集:

このスレッドの助けを借りて:特定のスパン クラスに含まれるデータを取得する

解決:

<?php
$html=file_get_contents('http://www.example.com/');
preg_match_all("/\<span class\=\"products\"\>(.*?)\<\/span\>/",$html,$b);

foreach($b as $key => $value) {
$$key = $value;
}

echo $value[4]; // Returns 4th key, or "Product 5"

はい、コードのフォーマットが苦手です

4

1 に答える 1

0
$markup = '<span class="Products-Name">Used Gibson USA</span>
    <span class="Products-Discription">Les Test Test Test Paul Custom 1986
    <br />with Factory Kahler </span>';
$markup = preg_replace('~<br\\s*/?>~si', ' ', $markup); // replace <br> with space
$markup = preg_replace('~\\s+~', ' ', $markup); // compact consecutive spaces into a single space
if(preg_match_all('~<span class="Products-(.+?)">(.*?)</span>~si', $markup, $matches)){
    // trim the enite deep array
    array_walk_recursive($matches, function(&$match){
        $match = trim($match);
    });
    // this shows you how the $matches is structured
    list($raw_matches, $class_matches, $inner_matches) = $matches;
    // combine class names with span inner value
    var_dump(array_combine($matches[1], $matches[2]));
}
// this is how you loop preg_match_all() results
foreach($matches[0] as $key => $raw_match){
    $class_match = $matches[1][$key];
    $inner_match = $matches[2][$key];
    if(!strcasecmp($class_match, 'what YOU seek')){
        echo $inner_match;
    }
}
于 2013-07-07T21:00:00.950 に答える