PHP 正则匹配标签内容,根据字符串长度进行替换

$str="
<p>是的范德萨第三方第三方水电费送达发送发斯蒂芬送达送达</p>
<h1>更好地规划获得更好地方获得更好</h1>
<p> 水电费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分</p>
<h1>的官方说的跟是梵蒂冈富商大贾讽德诵功发的大概发给水电费是梵蒂冈是</h1>
<p>奋斗过水电费是第三个是是个地方官</p>
"

实现:

$str 里所有h1标签内容长度超过20个字,进行追加h1标签。根据上文实现下面效果:

$str="
<p>是的范德萨第三方第三方水电费送达发送发斯蒂芬送达送达</p>
<h1>更好地规划获得更好地方获得更好</h1>
<p> 水电费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分</p>
<h1>的官方说的跟是梵蒂冈富商大贾讽德诵功发的</h1><h1>大概发给水电费是梵蒂冈是</h1>
<p>奋斗过水电费是第三个是是个地方官</p>
"
求方法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

阅读 3.3k
3 个回答

写了一个函数

/**
 * @param string $html html文本数据
 * @param array $rule 处理的规则,  [ '需要处理的标签' => 限制的字符数量 ]
 * 
 */
function processing($html, $rule){
    $outHtml = "";
    $pattern = '/<([^>]+)>(.*)<\/([^>]+)>/U'; // 0为带标签的数据  1前标签  2为不带标签的文本内容  3后标签
    preg_match_all($pattern, $html, $data);
    foreach($data[3] as $k => $v){
        if(isset($rule[$v])){
            $len = mb_strlen($data[2][$k], 'utf8');
            if($len > $rule[$v]){
                $start = 0;
                $end = $len;
                do{
                    $subText = mb_substr($data[2][$k], $start, $rule[$v], 'UTF-8');
                    $outHtml .= "<{$data[1][$k]}>{$subText}</{$data[3][$k]}>";
                    $len -= $rule[$v];
                    $start += $rule[$v];
                    if($len<0) {
                        $len = 0;
                        $start = $end;
                    }
                }while($len);
                continue;
            }
        }
        $outHtml .= $data[0][$k];
    }
    return $outHtml;
}

使用

$html = '<div class="text">是的范德萨第三方第三方水电费送达发送发斯蒂芬送达送达</div>
<h1>这是H1更好地规划获得更好地方获得更好</h1>
<p> 水电费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分费第三方都是范德萨范德萨范德萨水电费阿道夫告诉对方水电费电风扇分</p>
<h1 class="text">这是一段测试,此处是需要处理的一段标题数据!字符超过指定字数会对这段进行处理,数据数据数据数据数据数据</h1>
<h2>这是一另段测试,这里是H2的数据,数据</h2>
<p>奋斗过水电费是第三个是是个地方官</p>';

$out = processing($html, ['h1' => 20, 'h2' => 10]);
var_dump($out);

规则中符合规定的h1、h2会进行替换,变成带相同标签的多行,并且带了标签的class等属性。这样就可以随意设置要替换的标签和长度了。
不用带的话会更好处理,改一改do中间那一段就行。

用正则把多于20个字的<h1>匹配出来,然后交给另一个函数处理插入工作。

preg_replace_callback函数来实现,具体用法参考文档。

这是代码:

//匹配 h1,h2...标签,根据字符串长度补充标签


    function message($template)
    {
        if(empty($template)) {
            return null;
        }
        $regex  = '/<h1>(.*?)<\/h1>/si'; 
        return preg_replace_callback($regex, function($matches){
            $key = '<h1>'.chunk_split($matches[1],6,'</h1><h1>').'</h1>';
            return $key.'?';
        }, $template);
    }

    //Example
    $template = "<p>这是内容</p><h1>这是一级标题</h1><h2>这是二级标题</h2><h3>这是三级标题</h3>"; //正文内容获取
    echo  message($template);


想把h1.h2.h3标签都实现,不知道该怎么写

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题