preg_match_all выводит все теги h с типом - PullRequest
1 голос
/ 25 октября 2011

Я хочу создать таблицу всех тегов 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, это было бы здорово.

Ответы [ 4 ]

2 голосов
/ 25 октября 2011

Ваше регулярное выражение уже работало нормально. Но preg_match_all возвращает массивы результатов, обычно упорядоченные по группам совпадений. Однако вы можете добавить флаг PREG_SET_ORDER в качестве четвертого параметра к preg_match_all, как это ожидает ваш foreach:

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

Кстати, это вполне законное использование (и маловероятное использование) использования регулярных выражений, если мы можем предположить, что вы работаете над выводом своих собственных приложений, чтобы добавить таблицу заголовков.

1 голос
/ 27 декабря 2012

Используйте этот метод для возврата ассоциативного массива с тегами заголовков, их типами и экземплярами:

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;
}
0 голосов
/ 25 октября 2011

Если вы анализируете весь HTML-контент страницы, я бы порекомендовал вам попробовать PHP 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);
0 голосов
/ 25 октября 2011

Я хочу узнать больше о регулярных выражениях, вам лучше купить хорошую книгу. Или просто Google для хороших учебников. Лично мне нравится regular-expressions.info

Всю информацию о функции preg_match_all можно найти в официальной документации here. Сообщество PHP обычно делится некоторым полезным кодом на страницах справочника, я полагаю, что вы можете найти там любую информацию, какую захотите.

php > $ch = curl_init('/7688510/pregmatchall-vyvodit-vse-tegi-h-s-tipom');                                              
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',
  ),
)
...