搜索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转换需要更多工作。为了使正则表达式更可靠,例如,可以将内部文本匹配模式
(.*?)
写为([^<>]*)
。
所以我试着将它应用到我的脚本中,但这根本不起作用,这是我的代码
<?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;
?>
答案 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();