<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这部分代码与文章内容无关,用于示例演示</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"开始执行脚本...\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
<h2>strip_tags 与 preg_replace 配合使用时,如何实现自定义标签的过滤和处理?</h2>
<p>在PHP中,处理HTML字符串时,经常需要对其中的标签进行过滤或替换。<code></span><span><span class="hljs-title function_ invoke__">strip_tags</span></span><span>()
从示例中可以看到,只有<strong>标签被保留,其它标签被删除。
preg_replace支持正则表达式,可以用来匹配复杂的标签格式,甚至对标签内部的属性进行处理。例如:
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-string">"<p class='intro'>示例文本</p>"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/<p[^>]*>/i'</span></span><span>, </span><span><span class="hljs-string">'<div class="new-intro">'</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span><span><span class="hljs-comment">// 输出:<div class="new-intro">示例文本</p></span></span><span>
这里用正则将所有带属性的<p>标签替换成了带新class的<div>标签。p>
<h3>三、结合strip_tags和preg_replace实现自定义标签过滤和处理h3>
<p>strip_tags功能简单,无法对标签属性进行判断,也不能对标签内的内容做复杂处理。结合preg_replace可以先用正则替换自定义标签为标准标签或者做属性调整,再用strip_tags过滤非允许标签。p>
<p>示例:我们希望只保留<b>和<a>标签,但需要把自定义标签<mytag>转换成<span>,并且对<a>标签只保留href属性。p>
<pre><code>
$html = "这是<mytag>自定义标签</mytag>,还有<a href='http://example.com' title='title'>链接</a>,以及<b>加粗</b>。";
// 第一步:将<mytag>替换成<span>
$html = preg_replace([
'/<\/?mytag>/i'
], [
function($matches) {
return str_ireplace(['mytag','/mytag'], ['span','/span'], $matches[0]);
}
], $html);
// 第二步:过滤掉<a>标签的非href属性
$html = preg_replace_callback('/<a\s+([^>]*)>/i', function($matches) {
// 只保留href属性
if (preg_match('/href\s*=\s*["\']?([^"\'>\s]+)["\']?/i', $matches[1], $hrefMatch)) {
return '<a href="' . $hrefMatch[1] . '">';
}
return '<a>';
}, $html);
// 第三步:用strip_tags保留指定标签
$result = strip_tags($html, '<b><a><span>');
echo $result;
这样,原本的<mytag>就被替换成了<span>,<a>标签只保留了href属性,且整体只允许保留<b>、<a>和<span>标签,其他标签均被剔除。 根据需求合理设计正则表达式和过滤逻辑,是实现自定义标签过滤和处理的关键。四、总结