0

詳細な preg_match_all を機能させるのに問題があります。空の配列を取得し続けます。

これが私のコードです:

  <?php
  $remote_search = file_get_contents('http://wiki.seg.org/index.php?title=Special%3ASearch&search=drilling&button=');
  preg_match_all('%<li><div class=\'mw-search-result-heading\'><a href="(.*)" title="(.*)">(.*)</a>  </div> <div class=\'searchresult\'>(.*)</div>
  <div class=\'mw-search-result-data\'>(.*)</div></li>%si', $remote_search, $links);
  echo '<ul class=\'mw-search-results\'>';
  for($i = 0; $i < count($links[1]); $i++) {
  echo '<li><div class=\'mw-search-result-heading\'><a href="' . $links[5][$i] . '" title="' . $links[4][$i] . '">' . $links[3][$i] . '<\/a>  </div> <div class=\'searchresult\'>' . $links[2][$i] . '<\/div><div class=\'mw-search-result-data\'>' . $links[1][$i] . '<\/div><\/li>';
  }
  echo '</ul>';
  ?>

以下に示すコードからリンクの詳細を取得しようとしています。

<li><div class='mw-search-result-heading'><a href="/index.php/Dictionary:Cable_drilling" title="Dictionary:Cable drilling">Dictionary:Cable drilling</a> </div> <div class='searchresult'>{{lowercase}}{{#category_index:C|cable <span class='searchmatch'>drilling</span>}} </div> <div class='mw-search-result-data'>132 B (22 words) - 19:58, 20 December 2011</div></li>

私が実行すると、結果としてvar_dump($links);得られます。Array

以下のコードは、変数を取得しようとしているセクションの内容を取得するために機能します。

  <?php
  $remote_search = file_get_contents('http://wiki.seg.org/index.php?title=Special%3ASearch&search=drilling&button=');
  preg_match_all('%<ul class=\'mw-search-results\'>(.*)</ul>%si', $remote_search, $links);
  $bar = $links[0];
  echo '<ul class=\'mw-search-results\'>';
  echo $bar;
  echo '</ul>';
  var_dump($links);
  ?>

echo $bar;結果は出力されませArrayん。

このvar_dump($links);スニペットの は、ul のコンテンツを出力します。

私の一番上のスニペットに、意図したとおりにコードを解析するのを妨げているエラーが表示されますか?

4

2 に答える 2

0

試す:

preg_match_all('@<li><div\s*class=\'mw-search-result-heading\'><a\s*href=.([^"]*).\s*title=.([^"]*).>([^<]*)<\/a>\s*<\/div>\s*<div\s*class=\'searchresult\'>(.*?)<\/div>\s*<div\s*class=.mw-search-result-data.>([^<]*)<\/div><\/li>@sim', $remote_search, $links);
print_r($links);

あなたのコードの論理エラーは、あなたが照合していた方法でした<div class=\'searchresult\'>(.*)</div><div class='searchresult'>{{lowercase}}{{#category_index:C|cable <span class='searchmatch'>drilling</span>}}</div> これは、ネストされたタグがあるため、正規表現ではうまく機能しません - span. だから私はあなたのマッチングロジックを貪欲ではないものに変更しました: .*?。また、正規表現のフラグ修飾子を に変更した方法にも注目してsimください。HTML に対して正規表現を使用するときは常に、これら 3 つの修飾子を使用します。私はそれらを頻繁に使用し、修飾子を覚えるのに役立つ記憶補助として、修飾子の文字を「sim」という単語に配置する方法さえ見つけました。

ハッピーコーディング!

于 2012-10-10T06:55:12.110 に答える
0

正規表現で html を解析しようとしないでください。DOMDocument代わりに使用してください。あなたの場合、ファイルからリンクを取得するには、次のようなことができます:

$dom = new DOMDocument();
$dom->load($url);

$elements = $dom->getElementsByTagName('a');
$links = array();
foreach ($elements as $element)
    $links[] = $element->getAttribute('href');

var_dump($links);
于 2012-10-10T06:36:01.613 に答える