preg_match_all输出所有带有类型的h标签

时间:2011-10-25 00:21:37

标签: php preg-match-all

我想创建一个包含特定页面的所有h标签的表格(seo原因)并用它们填充表格。

        $str = file_get_contents($Url);
        if(strlen($str)>0){
            preg_match_all(" /<(h\d*)>(\w[^<]*)/i",$str,$headings);

            foreach ($headings as $val) {
                echo "type: " . $val[1] . "\n";
                echo "content: " . $val[2] . "\n";
            }
        }

此刻我只是回应他们并得到奇怪的结果这是我第一次使用正则表达式,所以我认为它的问题出现了问题。

如果有人知道一个关于处理数组preg_match_all的好教程,那将会很棒。

5 个答案:

答案 0 :(得分:2)

你的正则表达式已经正常工作了。但preg_match_all返回通常按匹配组排序的结果数组。但是,您可以将PREG_SET_ORDER标记作为第四个参数添加到preg_match_all,这是您的foreach期望它:

preg_match_all("/<(h\d*)>(\w[^<]*)/i",$str,$headings, PREG_SET_ORDER);

顺便说一下,如果我们可以假设您正在使用自己的应用程序输出来添加标题表,那么这是一个完全合法的使用(并且不太可能失败)正则表达式。

答案 1 :(得分:1)

使用此方法返回带有标题标签及其类型和实例的关联数组:

public function getHeadingTags()
{
    preg_match_all( "#<h(\d)[^>]*?>(.*?)<[^>]*?/h\d>#i", 
                    $this->html, 
                    $matches,
                    PREG_PATTERN_ORDER
                  );
    $headings = array();
    foreach ($matches[1] as $key => $heading_key) {
        $headings["h$heading_key"][] = $matches[2][$key];
    }

    ksort($headings);
    return $headings;
}

答案 2 :(得分:0)

我想更多地了解正则表达式,你最好买一本好书。 或者只是谷歌的好教程。我个人喜欢regular-expressions.info

有关preg_match_all功能的所有信息均可在官方文档here中找到。 PHP社区通常在手册页面上共享一些有用的代码,我相信你可以找到你想要的任何信息。

php > $ch = curl_init('http://stackoverflow.com/questions/7883392/preg-match-all-output-all-h-tags-with-type');                                              
php > curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $data = curl_exec($ch);
php > preg_match_all("!<h(\d)[^>]*>(.*?)</h\\1>!ism",$data,$headings);
php > var_export($headings);
array (                     
  0 =>                      
....  
2 =>
  array (
    0 => '<a href="/questions/7883392/preg-match-all-output-all-h-tags-with-type" class="question-hyperlink">preg_match_all output all h tags with type</a>',
    1 => '',
    2 => '
            Know someone who can answer?
            Share a <a href="/q/7883392">link</a> to this question via
            <a href="mailto:?subject=Stack%20Overflow%20Question&amp;body=preg_match_all%20output%20all%20h%20tags%20with%20type%0Ahttp%3a%2f%2fstackoverflow.com%2fq%2f7883392">email</a>,
            <a href="http://twitter.com/share?url=http%3a%2f%2fstackoverflow.com%2fq%2f7883392&amp;text=preg_match_all%20output%20all%20h%20tags%20with%20type">twitter</a>, or
            <a href="http://www.facebook.com/sharer.php?u=http%3a%2f%2fstackoverflow.com%2fq%2f7883392&amp;t=preg_match_all%20output%20all%20h%20tags%20with%20type">facebook</a>.
        ',
    3 => 'Your Answer',
    4 => '
            Browse other questions tagged <a href="/questions/tagged/php" class="post-tag" title="show questions tagged \'php\'" rel="tag">php</a> <a href="/questions/tagged/preg-match-all" class="post-tag" title="show questions tagged \'preg-match-all\'" rel="tag">preg-match-all</a>
                or <a href="/questions/ask">ask your own question</a>.
        ',
    5 => 'Hello World!',
    6 => 'Related',
  ),
)

答案 3 :(得分:0)

如果您正在解析网页的整个HTML内容,我建议您尝试PHP's DomDocument

$str = file_get_contents($Url);

$dom = new DomDocument();
$dom->loadHTML($str);           

$hs = array();
for($type=1; $type<6; $type++)
{
  $h_es = $dom->getElementsByTagName('h'.$type);
  foreach($h_es as $h)
  {
    $hs[] = array('type'=>$type, 'content'=>$h->textContent);
  }
}

print_r($hs);

答案 4 :(得分:0)

也可以使用此方法(用于获取所有标签H)。 我测试了它,而且效果很好。 因为我自己需要它。

$str = file_get_contents($Url);
preg_match_all("|<h+[1-6](.*?)<\/h[1-6]+>|", $str , $matches_h_tag);
 $h_tags = "";
for($i=0; $i <= count($matches_h_tag[0]); $i++){
$h_tags .= $matches_h_tag[0][$i]; 
}
 echo $h_tags;

获取所有标签(h)的简便方法