Php 仅替换第二个html标记

Php 仅替换第二个html标记,php,regex,html-parsing,preg-replace,preg-split,Php,Regex,Html Parsing,Preg Replace,Preg Split,我想将第二个h2标记替换为h3,我希望有人能帮助我替换正则表达式,或者可能是preg_split-我不太确定 例如,这: <h2>My text one</h2> <h2>My text two</h2> text … <h2>My text three</h2> My text one 我的课文二 文本… 我的课文三 应该是这样的: <h2>My text one</h2> <h3>

我想将第二个
h2
标记替换为
h3
,我希望有人能帮助我替换正则表达式,或者可能是
preg_split
-我不太确定

例如,这:

<h2>My text one</h2>
<h2>My text two</h2>
text …
<h2>My text three</h2>
My text one
我的课文二
文本…
我的课文三
应该是这样的:

<h2>My text one</h2>
<h3>My text two</h3>
text …
<h2>My text three</h2>
My text one
我的课文二
文本…
我的课文三

我同意其他评论,这应该通过dom解析器完成。但这里有一个可行的php解决方案

<?php 
     // Fill $str with the html;

     preg_replace("/[h]{1}[2]/i", "h3", $str);
?>


这应该很好用。将$matches参数添加到preg_replace还将跟踪所做更改的数量。 现在,使用循环可以控制需要替换的元素,但是,上面写的函数将检测h2的所有出现

此外,我已经对regexp进行了过度复杂的处理,以便您能够交换数字,从而使其成为一个更有用的函数。只要使用“/(h2)/i”也可以

因此,您的代码应该以正确的方式实现一个循环,以防止替换所有的标记,并且您应该决定函数是只处理h2还是应该更灵活


最后一句话,str_replace比preg_replace快,因此如果这是您需要进行的唯一编辑,我建议您使用str_replace。

我同意其他注释,这应该通过dom解析器完成。但这里有一个可行的php解决方案

<?php 
     // Fill $str with the html;

     preg_replace("/[h]{1}[2]/i", "h3", $str);
?>


这应该很好用。将$matches参数添加到preg_replace还将跟踪所做更改的数量。 现在,使用循环可以控制需要替换的元素,但是,上面写的函数将检测h2的所有出现

此外,我已经对regexp进行了过度复杂的处理,以便您能够交换数字,从而使其成为一个更有用的函数。只要使用“/(h2)/i”也可以

因此,您的代码应该以正确的方式实现一个循环,以防止替换所有的标记,并且您应该决定函数是只处理h2还是应该更灵活


最后一句话,str_replace比preg_replace快,因此,如果这是您需要进行的唯一编辑,我建议您使用str_replace。

您可以使用Javascript轻松实现这一点,是否真的需要使用PHP

获取第二个

$text = $("h2:eq(1)").html();
摧毁它

$("h2:eq(1)").remove();
在第一个
之后创建一个
,其中包含
$text

$("h2:eq(0)").after("<h3>" + $text + "</h3>");
$(“h2:eq(0)”)。在(“+$text+”)之后;

您可以使用Javascript轻松做到这一点,它真的需要使用PHP吗

获取第二个

$text = $("h2:eq(1)").html();
摧毁它

$("h2:eq(1)").remove();
在第一个
之后创建一个
,其中包含
$text

$("h2:eq(0)").after("<h3>" + $text + "</h3>");
$(“h2:eq(0)”)。在(“+$text+”)之后;

您不需要为此使用服务器端HTML解析器,这在我看来是完全多余的。下面的示例显然可能会被某些HTML构造破坏,但对于大多数标记来说,它不会有任何问题,而且比服务器端HTML解析器更为优化

$html = '
<h2>My text one</h2>
<h2>My text two</h2>
text ...
<h2>My text three</h2>
';
$html='1!'
我的文本一
我的课文二
文本。。。
我的课文三
';
预赛

///以下preg匹配将找到所有标记,即使
///由于's'开关,h2的内容在新行上拆分
///这也是一个非贪婪的匹配-多亏了“.+?”,所以它不应该
///跨越多个h2标记时出现问题。只会
///如果你有一个h2作为一个h2的后代,它会崩溃
///将是非法的html-或者如果您的h2中有一个“>”
///属性,即再次显示的文本
///是非法的,因为它们应该被编码。
预赛(
“#(]*>。+?)#是”,
$html,
$matches,
预偏移捕获预设置顺序
);
更换和重建

///因为您只想替换第二项,请使用以下命令。
///但是,您可以根据需要将此代码设置为一般代码或特定代码。
///以下方法有效,因为找到了
///$matches是使用正则表达式中的分组括号存储的
///表情。这意味着您可以轻松地更改regexp和
///下面的代码仍然可以工作。
///为了更好地了解正在发生的事情,最好是
///“回声”;打印(匹配项);回声“/”`
如果(isset($matches[1][0])){
$html=substr($html,0,$matches[1][0][1])。
$matches[1][1][0]。“h3”。
$matches[1][2][0]。“h3”。
$matches[1][3][0]。
substr($html,$matches[1][0][1]+strlen($matches[1][0][0]);
}
我不知道为什么很多人说要使用客户端JavaScript来实现这一改变,PHP代表
PHP:Hypertext Preprocessor
它是为预处理超文本而设计的。OP只提到了PHP函数,并用PHP标记了这篇文章,因此没有任何东西指向客户端

诚然,虽然客户端可以而且应该在可能的情况下使用,以减轻服务器端的处理,但不建议将其用于标题等核心结构标记,这将由屏幕阅读器和搜索引擎机器人依赖。最好使用客户端JavaScript来增强用户体验。如果您使用它来批判性地增强站点的功能,那么最好确保您的enitre用户群支持它


但是,如果你们中有人提到过,我会很高兴地同意的。

你不需要为此使用服务器端HTML解析器,这在我看来是完全过火了。下面是一个明显可能被某些HTML构造破坏的示例,但对于大多数标记来说,它不会有任何问题,而且比服务器端HTML解析器更为优化

$html = '
<h2>My text one</h2>
<h2>My text two</h2>
text ...
<h2>My text three</h2>
';