Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式:如何剥离所有HTML标记而不是非HTML标记?_Php_Regex_String - Fatal编程技术网

PHP正则表达式:如何剥离所有HTML标记而不是非HTML标记?

PHP正则表达式:如何剥离所有HTML标记而不是非HTML标记?,php,regex,string,Php,Regex,String,使用PHP正则表达式,如何在不删除非HTML标记(如或)的情况下删除打开和关闭的HTML标记以及具有类似属性的HTML标记 非HTML标记是动态的,不能硬编码 输入: <b><> <<> <dog> <123> <" !> <!--...--> <!doctype> <hr class="myclass" /> </b> 输出应为: <> <<&

使用PHP正则表达式,如何在不删除非HTML标记(如或)的情况下删除打开和关闭的HTML标记以及具有类似属性的HTML标记

非HTML标记是动态的,不能硬编码

输入:

<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提供了额外的修复。我会试试: