在字符串中查找H2标记并为其指定ID

时间:2011-02-17 16:28:50

标签: php string wordpress

搜索stackoverflow我找到了一个满足我需求的答案,但如果有人能给我一个提示,我无法弄清楚如何使用它会很感激!

这是我的需要,我正在使用wordpress,我会将自动ID设置为< ...>标签,所以我发现“mario”谁回答这个问题:

  

如果你有一个连贯的输入   那,你可以使用常规   表达式。在这种情况下,它们都是   非常接受和简单:

$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>"; }
     

ID转换需要更多工作。为了使正则表达式更可靠,例如,可以将内部文本匹配模式(.*?)写为([^<>]*)

     

H2 tag auto ID in php string

所以我试着将它应用到我的脚本中,但这根本不起作用,这是我的代码

<?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 个答案:

答案 0 :(得分:1)

不要使用正则表达式来解决该问题。使用domdocument:

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;

答案 1 :(得分:1)

永远不要使用RegEx for 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();