【问题标题】:PHP regex return zero resultPHP正则表达式返回零结果
【发布时间】:2017-01-07 11:15:49
【问题描述】:

我有以下 PHP curl 和正则表达式代码。我想从网站获取帖子标题。实际上,有10篇文章。但代码返回零结果。

PHP:

<?php 
$ch = curl_init();
$url = "www.mahsumakbas.net";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$content = curl_exec($ch);
curl_close($ch);

@preg_match_all('/<h2 class="entry-title">(.*)<\/h2>/' ,$content, $matches); 


for ($i=0;  $i< sizeof($matches[1]); $i++)
    echo $matches[1][$i]."<br/>";

?>

在 www.mahsumakbas.net 网页上有 10 个&lt;h2 class="entry-title"&gt; 附有&lt;/h2&gt;

我错过了什么?

【问题讨论】:

  • 当他们为那些 h2 添加一个简单的额外空间或额外属性时,你认为会发生什么? stackoverflow.com/a/1732454/1067003
  • tl;dr 是:不要使用正则表达式来解析 html。 $results=[];$domd=@DOMDocument::loadHTML($content);foreach($domd-&gt;getElementsByTagName("h2") as $h2){if($h2-&gt;getAttribute("class") !=="entry-title")continue;$matches[]=$h2-&gt;textContent;}var_dump($matches);
  • for ($i=0; $i&lt; sizeof($matches[1]); $i++) 不是在 PHP 中循环遍历数组的方法,请改用 foreach

标签: php regex curl preg-match-all


【解决方案1】:

试试这个:

$url = "www.mahsumakbas.net";
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
//curl_setopt(... other options you want...)
$html = curl_exec($c);

curl_close($c);
preg_match_all("'<h2 class=\"entry-title\">(.*?)</h2>'si" ,$html, $matches); 

foreach($matches[1] as $key=>$val)
    echo $val."<br/>";

【讨论】:

  • @MahsumAkbas 欢迎。如果问题已解决,您可以将其标记为答案。
【解决方案2】:

您的标题由 3 行组成。您必须设置“m”选项。也许有帮助。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

但要解析 HTML-DOM 字符串,您应该使用 DOMDocument 和 getElementByTagName

【讨论】:

  • 实际上使用 XPath 比 getElementsByTagName 更适合,他不想要 h2 标签,他想要也有 class="entry-title" 属性的 h2 标签。但是是的
  • 他也可以稍后检查课程;)但你的权利。 XPath 更容易
猜你喜欢
  • 2017-11-22
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2019-10-19
  • 2016-01-22
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多