Php 在字符串中查找H2标记并给它一个ID

Php 在字符串中查找H2标记并给它一个ID,php,string,wordpress,Php,String,Wordpress,搜索stackoverflow我已经找到了我需要的答案,但我不知道如何使用它,如果有人能给我一个提示,我将不胜感激 这是我的需要,我正在使用wordpress,我想把自动ID放到标签上,所以我找到了回答这个问题的“mario”: 如果你有一个连贯的输入,比如 那你就可以用普通的 表达。在这种情况下,两者都是 非常容易接受和简单: $html = preg_replace_callback("#<(h[1-6])>(.*?)</\\1>#", "

搜索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>"; }

不要使用正则表达式来解决这个问题。使用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();