php字符串中的H2标记自动ID

php字符串中的H2标记自动ID,php,string,Php,String,我正在尝试编写一个wordpress过滤器,自动浏览内容并获取以下内容: <h2>lesson 1 bannanas</h2> 第1课班纳纳斯 并将其替换为 <h2 id="lesson-1-bannanas">lesson 1 bannanas</h2> 第1课班纳纳斯 这样我就可以将人们直接链接到页面或博客文章的各个部分。如果不使用像DOMDocument这样沉重的东西,我怎么做呢?另一种方法(实际上很简单,尽管它使用dom操作)是使用

我正在尝试编写一个wordpress过滤器,自动浏览内容并获取以下内容:

<h2>lesson 1 bannanas</h2>
第1课班纳纳斯
并将其替换为

<h2 id="lesson-1-bannanas">lesson 1 bannanas</h2>
第1课班纳纳斯

这样我就可以将人们直接链接到页面或博客文章的各个部分。如果不使用像DOMDocument这样沉重的东西,我怎么做呢?

另一种方法(实际上很简单,尽管它使用dom操作)是使用jQuery添加一个id,它与h2的内容相等(实际上很简单,尽管它使用dom操作)正在使用jQuery添加一个id,它等于h2的内容。如果您有这样一个连贯的输入,那么您可以使用正则表达式。在这种情况下,它既可接受又简单:

$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>";
}
$html=preg#u replace#u回调(“#(.*?)#”,“retitle”,“$html”);
函数重定时($match){
列表($\u未使用,$h2,$title)=$match;
$id=strtolower(strtr($title,“.”,“--”);
返回“$title”;
}

id转换需要更多的工作。为了使正则表达式更加可靠,内部文本匹配模式可以写成
([^]*)

如果您有这样一个连贯的输入,那么您可以使用正则表达式。在这种情况下,它既可接受又简单:

$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>";
}
$html=preg#u replace#u回调(“#(.*?)#”,“retitle”,“$html”);
函数重定时($match){
列表($\u未使用,$h2,$title)=$match;
$id=strtolower(strtr($title,“.”,“--”);
返回“$title”;
}

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

您可以使用stru replace将开头的h2标记替换为包含ID的标记

$tag = '<h2>My content</h2>';
$tag = str_replace('<h2>', '<h2 id = "an id">', $tag);
echo $tag;
$tag='My content';
$tag=str_替换(“”,,$tag);
echo$tag;

您可以使用str\u replace将开头的h2标记替换为包含您的ID的标记

$tag = '<h2>My content</h2>';
$tag = str_replace('<h2>', '<h2 id = "an id">', $tag);
echo $tag;
$tag='My content';
$tag=str_替换(“”,,$tag);
echo$tag;

我创建了一个
php
函数,可以自动向所有
h2
标记添加id

function h2slug($text) {
    preg_match_all("|<h2(.*)>(.*)</[^>]+>|U", $text, $out, PREG_SET_ORDER);
    foreach ($out as $header) {
        $slug = slug($header[2]);
        $header[1] = preg_replace('/(?<!\S\W\w\s)(\s?)id(\s?)="(\w*\W*)"/', '' , $header[1]);
        $text = str_replace($header[0], '<h2 id="'. $slug .'"'. $header[1] .'>'. $header[2] .'</h2>', $text);
    }
    return $text;
}
函数h2slug($text){
preg_match_all(“|(.*)+>|U“,$text,$out,preg_SET_顺序);
foreach($out作为$header){
$slug=slug($header[2]);
$header[1]=preg_replace('/(?'.$header[2].',$text);
}
返回$text;
}
使用:

<?php echo h2slug('<h2>Lesson 1 bannanas.</h2>'); ?>

出口:

<h2 id="lesson-1-bannanas">Lesson 1 bannanas.</h2>
第1课班纳纳斯。

我创建了一个
php
函数,可以自动向所有
h2
标记添加id

function h2slug($text) {
    preg_match_all("|<h2(.*)>(.*)</[^>]+>|U", $text, $out, PREG_SET_ORDER);
    foreach ($out as $header) {
        $slug = slug($header[2]);
        $header[1] = preg_replace('/(?<!\S\W\w\s)(\s?)id(\s?)="(\w*\W*)"/', '' , $header[1]);
        $text = str_replace($header[0], '<h2 id="'. $slug .'"'. $header[1] .'>'. $header[2] .'</h2>', $text);
    }
    return $text;
}
函数h2slug($text){
preg_match_all(“|(.*)+>|U“,$text,$out,preg_SET_顺序);
foreach($out作为$header){
$slug=slug($header[2]);
$header[1]=preg_replace('/(?'.$header[2].',$text);
}
返回$text;
}
使用:

<?php echo h2slug('<h2>Lesson 1 bannanas.</h2>'); ?>

出口:

<h2 id="lesson-1-bannanas">Lesson 1 bannanas.</h2>
第1课班纳纳斯。

好的,它还需要用有效的css id字符替换空白。我可以很容易地做到这一点,但我不确定这是否能将人们链接到其中,因为浏览器会查找id,但找不到它,然后JQuery会在文档准备就绪时启动并添加id,我们会得到想要的html,但不会将浏览器滚动到正确的位置页面的一部分(关闭javascript后也会崩溃)嗯,它还需要用有效的css id字符替换空白。我可以很容易地做到这一点,但我不确定这是否能将人们链接到其中,因为浏览器会查找id,但找不到它,然后JQuery会在文档准备就绪时启动并添加id,我们只剩下想要的html,而不是浏览器滚动到正确的部分对于页面(javascript关闭时也会崩溃),我想要一些能够自动执行的东西,而这需要标题内容是先验知识,我想要一些能够自动执行的东西,而这需要标题内容是先验知识,这非常有效,甚至可以捕获h3/h4/h5案例^交换strtr($title,“.”,“--”)对于sanitize\u title($title)在WordPress下工作得非常好,因为
list
是一种语言结构,您可以完全省略
$\u unused
变量:
list(,$h2,“$title)=$match;
这非常有效,甚至还可以捕获h3/h4/h5案例^^将strtrtrt($title,“,”,“--”)替换为sanitize\u title($title)在WordPress下工作得非常好,因为
list
是一种语言结构,您可以完全省略
$\u未使用的
变量:
list(,$h2,$title)=$match;