当前位置: 首页> 最新文章列表> strip_tags 与 preg_replace 配合使用时,如何实现自定义标签的过滤和处理?

strip_tags 与 preg_replace 配合使用时,如何实现自定义标签的过滤和处理?

gitbox 2025-08-26
<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用于更复杂的匹配和替换

preg_replace支持正则表达式,可以用来匹配复杂的标签格式,甚至对标签内部的属性进行处理。例如:


</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-string">"&lt;p class='intro'&gt;示例文本&lt;/p&gt;"</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">'/&lt;p[^&gt;]*&gt;/i'</span></span><span>, </span><span><span class="hljs-string">'&lt;div class="new-intro"&gt;'</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">// 输出:&lt;div class="new-intro"&gt;示例文本&lt;/p&gt;</span></span><span>

这里用正则将所有带属性的<p>标签替换成了带新class的&lt;div&gt;标签。p> <h3>三、结合strip_tagspreg_replace实现自定义标签过滤和处理h3> <p>strip_tags功能简单,无法对标签属性进行判断,也不能对标签内的内容做复杂处理。结合preg_replace可以先用正则替换自定义标签为标准标签或者做属性调整,再用strip_tags过滤非允许标签。p> <p>示例:我们希望只保留&lt;b&gt;和&lt;a&gt;标签,但需要把自定义标签&lt;mytag&gt;转换成&lt;span&gt;,并且对&lt;a&gt;标签只保留href属性。p> <pre><code> $html = "这是&lt;mytag&gt;自定义标签&lt;/mytag&gt;,还有&lt;a href='http://example.com' title='title'&gt;链接&lt;/a&gt;,以及&lt;b&gt;加粗&lt;/b&gt;。"; // 第一步:将&lt;mytag&gt;替换成&lt;span&gt; $html = preg_replace([ '/&lt;\/?mytag&gt;/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>标签,其他标签均被剔除。

四、总结

  • strip_tags适合快速移除大部分标签,允许保留部分简单标签。
  • preg_replace配合回调函数,可以灵活处理标签转换、属性过滤等复杂需求。
  • 二者结合可以先用正则转换或调整标签,再用strip_tags做最终过滤,保证输出的HTML既安全又符合业务需求。

根据需求合理设计正则表达式和过滤逻辑,是实现自定义标签过滤和处理的关键。