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

切勿尝试使用正则表达式解析 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 回答
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 使用正则表达式时,我总是使用这三个修饰符。我经常使用它们,我什至找到了一种将修饰字母排列成一个单词的方法,即“sim”作为记忆辅助,以帮助记住修饰符。

快乐编码!

于 2012-10-10T06:55:12.110 回答