PHP正则表达式:如何剥离所有HTML标记而不是非HTML标记?
使用PHP正则表达式,如何在不删除非HTML标记(如或)的情况下删除打开和关闭的HTML标记以及具有类似属性的HTML标记 非HTML标记是动态的,不能硬编码 输入:PHP正则表达式:如何剥离所有HTML标记而不是非HTML标记?,php,regex,string,Php,Regex,String,使用PHP正则表达式,如何在不删除非HTML标记(如或)的情况下删除打开和关闭的HTML标记以及具有类似属性的HTML标记 非HTML标记是动态的,不能硬编码 输入: <b><> <<> <dog> <123> <" !> <!--...--> <!doctype> <hr class="myclass" /> </b> 输出应为: <> <<&
<b><> <<> <dog> <123> <" !> <!--...--> <!doctype> <hr class="myclass" /> </b>
输出应为:
<> <<> <dog> <123> <" !>
我正在考虑使用HTML净化器,但首先我需要知道这在正则表达式中是否可行
HTML标记参考:
提前感谢=使用名为的函数。它将删除所有HTML标记,因此将保留您的自定义标记。如果没有,则可以指定不希望删除的标记。使用名为的函数。它将删除所有HTML标记,因此将保留您的自定义标记。如果没有,则可以指定您不希望删除的标记。请考虑使用并打开,然后使用以明确列出您希望保留的特定标记和属性 记住,使用正则表达式解析HTML很容易引起Zalgo的愤怒。不要嘲笑Zalgo。考虑使用并打开,然后使用以明确列出您希望保留的特定标记和属性
记住,使用正则表达式解析HTML很容易引起Zalgo的愤怒。不要嘲笑Zalgo。要匹配和删除HTML 4.01元素的开始和结束标记,这个经过测试的PHP函数中的正则表达式将做得非常好: 功能条\u HTML\u标记$text {//Strips HTML4.01开始和结束标记。保留内容。 返回预更换'% 匹配开始或结束HTML 4.01标记。 序列 >打开标记关闭>分隔符。 |或不符合SGML的HTML注释。 |]*>或DOCTYPE。 %六’,$text; } 注意事项:不删除脚本。将删除这些结构中出现的任何开始或结束标记。无法正确解析符合通用SGML的注释。不处理短标签 编辑:添加了DOCTYPE和非SGML严格HTML注释的匹配。它现在正确地通过OP中的测试数据
EDIT2以前的版本缺少“s”单行修饰符。还向警告列表中添加了shorttags。要仅匹配和删除HTML 4.01元素的开始和结束标记,此测试PHP函数中的正则表达式将做得非常好: 功能条\u HTML\u标记$text {//Strips HTML4.01开始和结束标记。保留内容。 返回预更换'% 匹配开始或结束HTML 4.01标记。 序列 >打开标记关闭>分隔符。 |或不符合SGML的HTML注释。 |]*>或DOCTYPE。 %六’,$text; } 注意事项:不删除脚本。将删除这些结构中出现的任何开始或结束标记。无法正确解析符合通用SGML的注释。不处理短标签 编辑:添加了DOCTYPE和非SGML严格HTML注释的匹配。它现在正确地通过OP中的测试数据
EDIT2以前的版本缺少“s”单行修饰符。还向警告列表中添加了短标签。Dhon的另一种替代工作解决方案:
<?php
$exemption_array = array('<a href"http://www.autopartswarehouse.com/search/?searchType=global&N=0&Ntt=A1327630">');
function strip_HTML_tags_withExemptions( $str , $arrayExemption = array() ){
//Notes $arrayExemption holds all string exemptions in form of tags example <a href"http://www.autopartswarehouse.com/search/?searchType=global&N=0&Ntt=A1327630">
foreach( $arrayExemption as $k => $exemptions )
$str = str_replace($exemptions, " " , $str);
$str = preg_replace("/<\/?(!DOCTYPE|a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h\d|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp)((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>|<!--(.)*-->/i" , " ", $str);
$str = preg_replace('/\s\s+/', ' ', $str );
$str = preg_replace('/[\.]+/', '.', $str );
return $str;
}
?>
Dhon的另一个备选工作解决方案:
<?php
$exemption_array = array('<a href"http://www.autopartswarehouse.com/search/?searchType=global&N=0&Ntt=A1327630">');
function strip_HTML_tags_withExemptions( $str , $arrayExemption = array() ){
//Notes $arrayExemption holds all string exemptions in form of tags example <a href"http://www.autopartswarehouse.com/search/?searchType=global&N=0&Ntt=A1327630">
foreach( $arrayExemption as $k => $exemptions )
$str = str_replace($exemptions, " " , $str);
$str = preg_replace("/<\/?(!DOCTYPE|a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h\d|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp)((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>|<!--(.)*-->/i" , " ", $str);
$str = preg_replace('/\s\s+/', ' ', $str );
$str = preg_replace('/[\.]+/', '.', $str );
return $str;
}
?>
@Maerlyn:使用strip_标记也会删除非HTML标记。@marknt15:您当时没有阅读手册。它有一个可选的第二个参数,使您能够指定不删除的标记列表。这不是OP想要的,但这是一种方法。。特别是如果他对输入域很了解的话。@Tomalak:不被删除的标签列表是动态的,我不知道它们都是这样的。我必须检查数百万条记录才能了解所有这些,我不想硬编码它们:@marknt15:将任意的类XML标记与真正的HTML混合在一起听起来是个糟糕的设计。你把这个文本放在哪里,HTML是危险的,但是任意标记不是。用正则表达式操纵DOM树是错误的。不要@Maerlyn:使用strip_标记也会删除非HTML标记。@marknt15:您当时没有阅读手册。它有一个可选的第二个参数,使您能够指定不删除的标记列表。这不是OP想要的,但这是一种方法。。特别是如果他对输入域很了解的话。@Tomalak:不被删除的标签列表是动态的,我不知道它们都是这样的。我必须检查数百万条记录才能了解所有这些,我不想硬编码它们:@marknt15:将任意的类XML标记与真正的HTML混合在一起听起来是个糟糕的设计。你把这个文本放在哪里,HTML是危险的,但是任意标记不是。用正则表达式操纵DOM树是错误的。不要!如果没有,可以指定不希望删除的标记。所以它会让你的自定义标签错误,因为你要在最后一句话中澄清。告诉用户他们可能使用哪些标签。此反转将允许使用此sim卡
一个解决方案,b对每个人都更好。@Tomalak:谢谢。我将编辑我的帖子:如果没有,可以指定您不希望删除的标签。所以它会让你的自定义标签错误,因为你要在最后一句话中澄清。告诉用户他们可能使用哪些标签。这种逆转将a允许这个简单的解决方案,b对每个人都更好。@Tomalak:谢谢。我会编辑我的帖子:除了主正则表达式不可读之外,还不错。但是,注释子表达式中的点星太贪婪,会消耗一行上多个注释之间出现的好东西。它也无法匹配多行注释。若要修复此问题,请将表达式更改为:并添加“s”修饰符。注意:我的正则表达式也缺少“s”修饰符-谢谢你的回答,否则我永远也找不到它!很抱歉,这里有点不对劲,但这一个也无法匹配现实生活中没有类似于标记的属性名=值对的s,例如,感谢ridgerunner提供了额外的修复。我会试试:除了主正则表达式不可读之外,还不错。但是,注释子表达式中的点星太贪婪,会消耗一行上多个注释之间出现的好东西。它也无法匹配多行注释。若要修复此问题,请将表达式更改为:并添加“s”修饰符。注意:我的正则表达式也缺少“s”修饰符-谢谢你的回答,否则我永远也找不到它!很抱歉,这里有点不对劲,但这一个也无法匹配现实生活中没有类似于标记的属性名=值对的s,例如,感谢ridgerunner提供了额外的修复。我会试试: