如何用explode或preg_split以HTML h1标签为分隔符拆分生成目标数组
PHP 拆分连续h1标签实现方案
基于需求指定的explode/preg_split实现要求,提供两种适配不同场景的可落地方案,均能完整保留h1标签属性、内部文本,输出符合要求的数组结构。
方案1:explode 适配固定紧密衔接场景
如果确认所有h1标签之间无空格、换行等额外字符,可通过匹配h1衔接的固定分隔符实现拆分,仅需少量后处理即可得到目标数组:
- 拆分依据为两个h1标签的衔接部分
</h1><h1 - 拆分后对首尾残缺的片段做标签补全
代码示例:
$html = '<h1 class="x">asd</h1><h1 class="y">zxcasd</h1>'; // 按h1衔接符拆分 $splitArr = explode('</h1><h1', $html); // 补全第一个元素的结束标签 $splitArr[0] .= '</h1>'; // 补全后续元素的开始标签 foreach ($splitArr as $index => $item) { if ($index > 0) { $splitArr[$index] = '<h1' . $item; } } print_r($splitArr);
输出结果:
Array ( [0] => <h1 class="x">asd</h1> [1] => <h1 class="y">zxcasd</h1> )
注意:该方案仅适用于h1标签严格紧密拼接的场景,如果h1之间存在换行、缩进等额外字符,拆分逻辑将失效。
方案2:preg_split 通用适配场景
使用正则正向预查匹配h1开标签的前序位置作为拆分点,无需后处理,可适配h1属性动态变化、h1之间存在空白字符的通用场景,鲁棒性更强。
采用的正则表达式:/(?=<h1\b[^>]*>)/
(?=...)正向预查,仅匹配拆分位置不消耗字符<h1\b精确匹配h1开标签,避免误匹配<h12>这类其他标签[^>]*兼容h1标签内的任意属性(class、id等)- 搭配
PREG_SPLIT_NO_EMPTY参数自动过滤字符串开头的空拆分元素
代码示例:
$html = '<h1 class="x">asd</h1><h1 class="y">zxcasd</h1>'; $splitArr = preg_split('/(?=<h1\b[^>]*>)/', $html, 0, PREG_SPLIT_NO_EMPTY); print_r($splitArr);
输出结果和方案1完全一致,且即使原字符串为"<h1 class=\"x\">asd</h1>\n <h1 class=\"y\">zxcasd</h1>"(h1间存在换行和缩进),也能正确拆分得到完整的h1标签片段。
说明:该方案对绝大多数业务场景的HTML h1标签均适用,若h1属性值包含
>特殊字符,需进一步调整正则逻辑,常规场景无需额外处理。
内容的提问来源于stack exchange,提问作者Murderous Koala
相关产品推荐
相关产品推荐

