Найдите тег H2 в строке и присвойте ему идентификатор - PullRequest
0 голосов
/ 17 февраля 2011

В поиске стека переполнения я нашел ответ на свой вопрос, но я не могу понять, как его использовать, если кто-то может дать мне подсказку. Это будет оценено!

Вот моя потребность, яЯ использую WordPress, и я хотел бы поставить автоматический идентификатор для тегов <...>, поэтому я нашел "Марио", которые отвечают на это:

Если у вас есть такой последовательный ввод, то вы можете использоватьрегулярные выражения.В этом случае это и очень приемлемо, и просто:

$html = preg_replace_callback("#<(h[1-6])>(.*?)</\\1>#", "retitle", $html);

function retitle($match) {
    list($_unused, $h2, $title) = $match;

    $id = strtolower(strtr($title, " .", "--"));

    return "<$h2 id='$id'>$title</$h2>"; }

Преобразование идентификатора требует немного больше работы.И чтобы сделать регулярное выражение более надежным, шаблон соответствия внутреннего текста (.*?) можно записать, например, как ([^<>]*).

Автоматический идентификатор тега H2 в строке php

Итак, я попытался применить это к моему сценарию, но это не работает вообще,вот мой код

<?php 
        $html = get_the_content();
        $html = preg_replace_callback("#<(h[1-6])>(.*?)</\\1>#", "retitle", $html);

        function retitle($match) {
            list($_unused, $h2, $title) = $match;
            $id = strtolower(strtr($title, " .", "--"));
            return "<$h2 id='$id'>$title</$h2>";
        }

        if(have_posts()) : while(have_posts()) : the_post(); //Vérifie que le contenu existe 
                echo $html;
            endwhile; 
        endif;
    ?>

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Никогда, никогда не используйте RegEx для HTML, хорошо? Просто прими это. Или прочитайте многочисленные сообщения здесь, почему бы и нет.

DOMDocument уродливый и злой. Вместо этого используйте simple_html_dom , это намного проще:

include 'simple_html_dom.php';

$html = str_get_html('<h2>hello</h2><h3>world</h3><h2 id='123'>how r ya</h2>');

$h2s = $html->find("h2");

foreach($h2s as $h2)
{
    if(!$h2->hasAttribute("id")) $h2->id = "title";
}

echo $html->save();
1 голос
/ 18 февраля 2011

Не используйте регулярные выражения для решения этой проблемы.Используя документ:

if (empty($content)) return '';
$dom = new DomDocument();
libxml_use_internal_errors(true)
$html = '<html>
           <head>
             <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
           </head>
           <body>'.$content.'</body>
         </html>';
$dom->loadHtml($html);
$hTAGs = $dom->getElementsByTagName($tag);
foreach ($hTAGs as $hTAG) {
    if (!$hTAG->hasAttribute('id')) {
        $title = $hTAG->nodeValue;
        $id = iconv('UTF-8', 'ASCII//TRANSLIT', $title);
        $id = preg_replace('/[^a-zA-Z0-9-\s]/', '', $id);
        $hTAG->setAttribute('id', $id);
    }
}
$content = '';
$children = $dom->getElementsByTagName('body')->item(0)->childNodes;
foreach ($children as $child) {
    $content .= $dom->saveXml($child);
}
return $content;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...