Php 在字符串中查找H2标记并给它一个ID
搜索stackoverflow我已经找到了我需要的答案,但我不知道如何使用它,如果有人能给我一个提示,我将不胜感激 这是我的需要,我正在使用wordpress,我想把自动ID放到标签上,所以我找到了回答这个问题的“mario”: 如果你有一个连贯的输入,比如 那你就可以用普通的 表达。在这种情况下,两者都是 非常容易接受和简单:Php 在字符串中查找H2标记并给它一个ID,php,string,wordpress,Php,String,Wordpress,搜索stackoverflow我已经找到了我需要的答案,但我不知道如何使用它,如果有人能给我一个提示,我将不胜感激 这是我的需要,我正在使用wordpress,我想把自动ID放到标签上,所以我找到了回答这个问题的“mario”: 如果你有一个连贯的输入,比如 那你就可以用普通的 表达。在这种情况下,两者都是 非常容易接受和简单: $html = preg_replace_callback("#<(h[1-6])>(.*?)</\\1>#", "
$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>"; }
不要使用正则表达式来解决这个问题。使用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;
if(空($content))返回“”;
$dom=新的DomDocument();
libxml\u使用\u内部错误(true)
$html='1
“.$content。”
';
$dom->loadHtml($html);
$hTAGs=$dom->getElementsByTagName($tag);
foreach($hTAGs作为$hTAG){
如果(!$hTAG->hasAttribute('id')){
$title=$hTAG->nodeValue;
$id=iconv('UTF-8','ASCII//TRANSLIT',$title);
$id=预更换('/[^a-zA-Z0-9-\s]/',''$id);
$hTAG->setAttribute('id',$id);
}
}
$content='';
$children=$dom->getElementsByTagName('body')->item(0)->childNodes;
foreach($childrenas$child){
$content.=$dom->saveXml($child);
}
返回$content;
永远不要对HTML使用正则表达式,好吗?接受这个吧。或者阅读这里的众多帖子
这个文件既丑陋又邪恶。相反,它更简单:
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();
包括“simple_html_dom.php”;
$html=str_get_html('helloworldhow r ya');
$h2s=$html->查找(“h2”);
foreach($h2s作为$h2)
{
如果(!$h2->hasAttribute(“id”))$h2->id=“title”;
}
echo$html->save();
您遇到的问题是什么?由于各种原因,正则表达式很容易失败。例如,如果标签已经包含
,它们将被忽略。如果您的标题包含换行符,那么您只需添加一个\s
regex标志。经过进一步验证,问题在于wordpress get_the_content()函数!那什么也不退!但是如果我得到的是带有_内容的内容();一切正常。。。如果retitle函数有问题,我会更新这篇文章,但问题更多的是来自wordpress。谢谢你的快速回答。马里奥,你是在另一个帖子上回答的人吗?如果是的话,你能告诉我我是否使用得很好(在get_the_content错误之外),以及是否有办法查看h2标签上是否已经有id吗?@JonathanLaf:用法似乎还可以,但我无法对WP函数get_content发表评论。正则表达式将跳过任何已经具有属性的
,包括现有的id=
属性。如果您想在那里筛选特定的条件,那么phpQuery/QueryPath会更容易。是否要解释静默的-1
?这个答案怎么了?您输入了一个错误:$id=iconv('URF-8')…
如果您有iframe:(。代码将在第一次保存节点时停止。我将更改为$dom->saveHTML($child)(PHP5.3.6)但在我遇到编码问题之后。DomDocument是一个。它绝对不是邪恶的。现在,如果你更喜欢Simple\u Html\u Dom
的界面,那就是你的观点。但是我发现你说DomDocument是邪恶的有点奇怪。有时候看看SHD的源代码……我同意DomDocument是邪恶的,或者至少不是有趣的。在PHP5.3.6中更好吗因为您最终可以使用带有节点参数的saveHTML。但它们仍然不是将结果输出为字符串的简单方法。我尝试使用DomDocument几个小时,然后切换到simple_html_dom,并在2分钟内解决了问题。
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();