php 正则清除HTML标签但保留其中一部分标签

 更新时间:2016年11月25日 17:41  点击:2155
php自带了很多函数可以直接过滤所有html标签了,但时我们是希望清除指定的html标签再保留另外一些html标签了,下面给各位整理了一个例子。

很多时候我们正则清除HTML标签但总希望保留其中一部分标签

用asp语言实现

 代码如下 复制代码

str="<a href=""a.htm"">a.htm</a><div>afefe</div>feaa<b>bbb</b> 

<a href=http://www.111cn.net id=""ggg"">ggg</a><abbr>测试</abbr>" 

Set re=new RegExp    

 re.IgnoreCase =true    

 re.Global=True    

 re.Pattern="(<(?!/?(a|p|b)(\s|>))[^>]*>)"    

 str=re.replace(str," ")    

 response.Write str  


那正则也可以用在其他语言里实现里实现

用php语言实现如下:

 代码如下 复制代码


$str='<a href="a.htm">a.htm</a><div>afefe</div>feaa<b>bbb</b><a href=http://www.baidu.com id="ggg">ggg</a><abbr>测试</abbr>'; 
echo preg_replace('/(<(?!\/?(a|p|b)(\s|\>))[^>]*>)/', '', $str);  
?> 

当然php有更简单的实现方法:

 代码如下 复制代码

$str='<a href="a.htm">a.htm</a><div>afefe</div>feaa<b>bbb</b

或者这样写

 代码如下 复制代码

/**
* @param $content
* @return mixed
* 过滤a标签保留内容
*/
public function delete_tags_a($content){
$content = preg_replace("#<a[^>]*>(.*?)</a>#is", "$1", $content);
return $content;
}

preg_match函数执行正则规则就可以过滤url中指定的一些字符了,下面来看一个url参数过程中由preg_match过滤一些字符的例子。

PHP开发中经常用到URL传递参数,对传递的参数要进行安全过滤,过滤URL中非法参数,这是php安全的一个细小的地方,却事关安全的大事。URL参数一般都是数字或者字母加上”-“或者”_”组成,参数带有其他的符号的都要进行过滤,以免带来安全问题。对URL传参进行非法字符过滤,用preg_match很容易判断非法的参数。

 代码如下 复制代码

if(!preg_match("/^[a-z0-9_\-]+$/i",$this->commentid))
    $this->_show_msg(L('illegal_parameters'));


这里$this->commentid就是从URL中$_GET方式传递过来的参数,接收URL$_GET方式传递的参数的时候也要进行处理,如:

 代码如下 复制代码

$this->commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ? trim(urldecode($_GET['commentid'])) : $this->_show_msg(L('illegal_parameters'));

PHP开发安全问题不容忽视,这些很细小的问题很简单就可以处理,但是容易倏忽。很多的漏洞都是从这里找到的。

如果是标签的读取xml我们可以直接使用SimpleXMLElement或dom之类的进行读取xml文档了,但今天小编碰到的是不标准的xml文档了,下面一起来看使用正则的处理办法。

如果在你的程序中收到这样的字符串:

 代码如下 复制代码
<ReportList><ordIndex>1</ordIndex><ordLabNo>1942268</ordLabNo><arcItemId>134</arcItemId><ordItemDesc>产品1</ordItemDesc><Status>执行</Status><ordDate>2013-08-12</ordDate><reportStatus>报告已出</reportStatus><reportException>0</reportException></ReportList><ReportList><ordIndex>2</ordIndex><ordLabNo>19434368</ordLabNo><arcItemId>135</arcItemId><ordItemDesc>产品2</ordItemDesc><Status>执行</Status><ordDate>2013-05-12</ordDate><reportStatus>报告未出</reportStatus><reportException>0</reportException></ReportList>

那么,恭喜你,php中我们常用的几种方法
都不会生效,如:

 代码如下 复制代码

$array = (array)new SimpleXMLElement($xml_str);
$array = (array)simplexml_load_string($xml_str);
$array = json_decode(json_encode(simplexml_load_string($xml_str)),true); 都是返回 false

所以我们只能自己写个方法喽

代码如下:

 代码如下 复制代码
function parse_xml_to_array($xmlstr,$loopTag){
    $args = explode('</'.$loopTag.'>',$xmlstr);
    $returns = array();
    if($args){
        $reg = '/<(\w+)[^>]*>([\x00-\xFF]*)<\/\1>/';
        foreach($args as $item){
            $item = str_replace('<'.$loopTag.'>','',$item);
            if(preg_match_all($reg, $item, $matches)) {
               if(isset($matches[1]) && isset($matches[2])){
                   $returns[] = array_combine($matches[1],$matches[2]);
               }
            }
        }
    }
    unset($args);
    return $returns;
}
$arr = parse_xml_to_array($xml,'ReportList');
var_dump($arr);

继续浏览有关 的文章

今天在做一个功能时因为以前我们填写的内容中有数字与中文了,但现在改版了只要数字了,使用intval函数发现如果开头不是数字就是0了,所以只有使用正则了,下面来看过程。

在网上搜索到这个测试一下发现还可以,但是如果字符长度不d{4} 不定长就不行了

 代码如下 复制代码

function findNum($str=''){
 if(empty($str)){return '';}
 $reg='/(\d{4}(\.\d+)?)/is';//匹配数字的正则表达式
 preg_match_all($reg,$str,$result);
 if(is_array($result)&&!empty($result)&&!empty($result[1])&&!empty($result[1][0])){
  return $result[1][0];
 }
 return '';
}

后来又发现知道中有一个

 代码如下 复制代码

$str=trim($str);
 if (preg_match('|(\d+)|',$str,$r)) return $r[1];

发现这个可以获取任意连续长度的数字了,当然在网上还看到很多,但有一个可以了所以就没有再测试了。

匹配中文有一些在编辑上的区别,如果我们不加以判断在不同编辑下匹配中文字节字符是不一样的,这是很多初学者在网上找找之后发现很多代码不能正确使用的原因所在了。

utf-8环 境下中文的匹配

\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

或许你也需要匹配双字节字符,中文也是双字节的字符

匹配双字节字符(包括汉字在内):[^\x00-\xff]

注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)


在ANSI(gb2312)环 境下

匹配全部的gb2312编 码表的字符:/[".chr(0xb0)."-".chr(0xf7)."]+/
单纯匹配汉字而不匹配全角标点:/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])/

该表达式能匹配一个中文字符。

匹配全角标点而不匹配汉字:/([".chr(0xa1)."-".chr(0xa3)."][".chr(0xa1)."-".chr(0xff)."])/

例子

 代码如下 复制代码

1、使用preg_match函数匹配汉字

<?php 
$str='asd我们cd'; 
$key='#[\x{4e00}-\x{9fa5}]#u'; 
preg_match($key,$str,$res); 
print_r($res) ; 
?> 
结果: 
Array([0]=>我)
2、使用preg_match函数匹配汉字(连续1个以上)

<?php 
$str='34353434我们cd'; 
$key='#[\x{4e00}-\x{9fa5}]{1,}#u'; 
preg_match($key,$str,$res); 
print_r($res) ; 
?> 
结果 
Array([0]=>我们)
3、改善1,使用preg_match_all函数匹配

<?php 
$str='34353434我们cd'; 
$key='#[\x{4e00}-\x{9fa5}]#u'; 
preg_match_all($key,$str,$res); 
print_r($res) ; 
?> 
结果 
Array([0]=>Array([0]=>我[1]=>们))
4、改善2,使用preg_match_all函数匹配汉字(连续1个以上)

<?php 
$str='34353434我们cd'; 
$key='#[\x{4e00}-\x{9fa5}]{1,}#u'; 
preg_match_all($key,$str,$res); 
print_r($res) ; 
 
?> 
结果 
Array([0]=>Array([0]=>我们))

由结果可看出,使用[\x4e00-\x9fa5]这个正则表达式可以匹配到中文。
preg_match或者preg_match_all的不同的地方就是,前者匹配一次就完了(无论是否匹配成功),而后者,会从待匹配的字符串的开头到结尾匹配一遍。

[!--infotagslink--]

相关文章

  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • C# 如何设置label(标签)控件的背景颜色为透明

    这篇文章主要介绍了C# 如何设置label(标签)控件的背景颜色为透明,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
  • matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())

    这篇文章主要介绍了matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • JS创建Tag标签的方法详解

    这篇文章主要介绍了JS创建Tag标签的方法,结合具体实例形式分析了javascript动态操作页面HTML元素实现tag标签功能的步骤与相关操作技巧,需要的朋友可以参考下...2017-06-15
  • C#删除UL LI中指定标签里文字的方法

    这篇文章主要介绍了C#删除UL LI中指定标签里文字的方法,涉及C#针对页面HTML元素进行正则匹配与替换的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 帝国CMS用灵动标签调用实现各种幻灯(焦点图)效果

    用灵动标签(e:loop)可以实现各种幻灯效果,本节讲解制作幻灯的基本方法。 如本站JS焦点图频道里的大部分幻灯图片效果都可以用灵动标签调用的。 ...2015-12-30
  • 帝国CMS灵动标签调用新闻正文内容第一张图片的方法

    有时候我们在建站的过程当中需要调用内容页中正文的第一张图片(并不是缩略图),这样就会无从下手,但其实对不懂开发的站长是太难了,往往是会用标题图片来取代,下面分享网友们贡献出...2015-12-30
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • 探讨JavaScript标签位置的存放与功能有无关系

    在网页中,我们可以将JavaScript代码放在html文件中任何位置,但一般放在head或body标签里面。一般来说,<script>元素放在哪里与其的功能作用是紧密相关的,通过本文我们一起学习下...2016-01-18
  • jquery实现标签支持图文排列带上下箭头按钮的选项卡

    带上下箭头jquery垂直tab选项卡切换标签,技持左侧列表上下滚动,滚动到底部带信息提示。复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml...2015-03-15
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • js 正则学习小记之匹配字符串字面量优化篇

    昨天在《js 正则学习小记之匹配字符串字面量》谈到 /"(?:\\.|[^"])*"/ 是个不错的表达式,因为可以满足我们的要求,所以这个表达式可用,但不一定是最好的...2021-05-07
  • C#使用正则表达式过滤html标签

    最近在开发一个项目,其中有需求要求我们把一段html转换为一般文本返回,使用正则表达式是明智的选择,下面小编给介绍下C#使用正则表达式过滤html标签,需要的朋友参考下...2020-06-25
  • 基于mybatis中<include>标签的作用说明

    这篇文章主要介绍了基于mybatis中<include>标签的作用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-20
  • OpenResty中正则模式匹配的2种方法详解

    在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 Nginx 的规范,下面这篇文章主要给大家介绍了关于OpenResty中正则模式匹配的2种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。...2020-06-30
  • 浅谈JS正则RegExp对象

    这篇文章主要介绍JS正则RegExp对象,正则表达式是描述字符模式的对象,用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。下面就来看具体详情,需要的朋友可以参考一下...2021-10-21
  • JS基于正则截取替换特定字符之间字符串操作示例

    这篇文章主要介绍了JS基于正则截取替换特定字符之间字符串操作方法,结合具体实例形式分析了JS基于正则实现针对特殊字符、数字等字符串类型的截取操作相关技巧,需要的朋友可以参考下...2017-02-08
  • HTML 标签中的 Markdown 使用方法

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式,下面我们来看一篇关于HTML 标签中的 Markdown 语法...2016-09-20
  • 帝国CMS灵动标签调用当前父栏目下所有子栏目-支持选中状态/高亮

    帝国CMS实现灵动标签调用当前父栏目下所有子栏目-支持选中状态及当前栏目高亮,支持栏目自定义排序。最适用于内容模板,显示父栏目下的子栏目。 支持静态栏目页与动态栏目页 代...2016-05-19