一个正则不好处理,像我这样处理,效率不高,但是兼容性一定好
$content = "
一段文字
文字
< class='p-name'>又一段文字";$addclasses = 'p-name';
// (img|p) 意思是 img 或 p ,如果要加上 div 那就改成 (img|p|div)
$content = preg_replace_callback('/]+)?>/', function($matches){
global $addclasses;
// 单独使用一个变量,要不然匹配多个会导致 $addclasses 逐个加上已有 class
global $classes;
$classes = $addclasses;
// 实现不修改原有单引号或双引号,不修改引号主要是考虑到个别情况下需要使用 JSON 数据
global $classquote;
$classquote = '"';
$attr = '';
$tagname = $matches[1];
// 删除 class 属性 HTML 并提取 class 到 $classes 变量
if (! empty($matches[2]) ) {
$attr = preg_replace_callback('/class=(?:"([^"]+)"|\'([^\']+)\')/', function($classmatches){
$thisclasses = '';
// 双引号
if (!empty($classmatches[1])) {
$thisclasses = $classmatches[1];
} else if (!empty($classmatches[2])) {
// 单引号
global $classquote;
$classquote = "'";
$thisclasses = $classmatches[2];
}
global $classes;
$classes = $thisclasses . ' ' . $classes;
return '';
}, $matches[2]);
}
// 去空去重
$classes = explode(' ', $classes);
$classes = array_flip(array_flip(array_filter($classes)));
$classes = join(' ', $classes);
// 如果是 img 标签过滤一下后面可能存在的 /
if ($tagname === 'img')
$attr = trim(trim($attr, '/'));
// 在属性 HTML 中加上 class 属性
$attr .= sprintf(' class=%1$s%2$s%1$s', $classquote, $classes);
// 包装
return sprintf('', $tagname, trim($attr));
}, $content);
echo $content;
//
一段文字
文字
< class='p-name'>又一段文字