php对包含html标签的字符串进行截取的函数分享

这个方法的作用是:php截取含有html标签的字符串,如果标签未闭合就闭合标签,防止未闭合的标签破坏原网页布局。截取完之后将多余的内容替换为...或者其他任意字符,支持锚点指定替换到指定位置。

/*
* ============================== 截取含有 html标签的字符串 =========================
* @param (string) $str   待截取字符串
* @param (int)  $lenth  截取长度
* @param (string) $repalce 超出的内容用$repalce替换之(该参数可以为带有html标签的字符串)
* @param (string) $anchor 截取锚点,如果截取过程中遇到这个标记锚点就截至该锚点处
* @return (string) $result 返回值
* @demo  $res = cut_html_str($str, 256, '...'); //截取256个长度,其余部分用'...'替换
* -------------------------------------------------------------------------------
* $ Author: Wang Jian.	|	Email: wj@yurendu.com	|	Date: 2014/03/16
* ===============================================================================
*/
function cut_html_str($str, $lenth, $replace='', $anchor='<!-- break -->'){
	$_lenth = mb_strlen($str, "utf-8");	// 统计字符串长度(中、英文都算一个字符)
	if($_lenth <= $lenth){
		return $str;	// 传入的字符串长度小于截取长度,原样返回
	}
	$strlen_var = strlen($str); 	// 统计字符串长度(UTF8编码下-中文算3个字符,英文算一个字符)
	if(strpos($str, '<') === false){
		return mb_substr($str, 0, $lenth);	// 不包含 html 标签 ,直接截取
	}
	if($e = strpos($str, $anchor)){
		return mb_substr($str, 0, $e);	// 包含截断标志,优先
	}
	$html_tag = 0; 	// html 代码标记
	$result = ''; 	// 摘要字符串
	$html_array = array('left' => array(), 'right' => array()); //记录截取后字符串内出现的 html 标签,开始=>left,结束=>right
	/*
	* 如字符串为:<h3><p><b>a</b></h3>,假设p未闭合,数组则为:array('left'=>array('h3','p','b'), 'right'=>'b','h3');
	* 仅补全 html 标签,<? <% 等其它语言标记,会产生不可预知结果
	*/
	for($i = 0; $i < $strlen_var; ++$i) {
		if(!$lenth) break;	// 遍历完之后跳出
		$current_var = substr($str, $i, 1); // 当前字符
		if($current_var == '<'){ // html 代码开始
			$html_tag = 1;
			$html_array_str = '';
		}else if($html_tag == 1){ // 一段 html 代码结束
			if($current_var == '>'){
				$html_array_str = trim($html_array_str); //去除首尾空格,如 <br / > < img src="" / > 等可能出现首尾空格
				if(substr($html_array_str, -1) != '/'){ //判断最后一个字符是否为 /,若是,则标签已闭合,不记录
					// 判断第一个字符是否 /,若是,则放在 right 单元
					$f = substr($html_array_str, 0, 1);
					if($f == '/'){
						$html_array['right'][] = str_replace('/', '', $html_array_str); // 去掉 '/'
					}else if($f != '?'){ // 若是?,则为 PHP 代码,跳过
						// 若有半角空格,以空格分割,第一个单元为 html 标签。如:<h2 class="a"> <p class="a">
						if(strpos($html_array_str, ' ') !== false){
						// 分割成2个单元,可能有多个空格,如:<h2 class="" id="">
						$html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
						}else{
						//若没有空格,整个字符串为 html 标签,如:<b> <p> 等,统一转换为小写
						$html_array['left'][] = strtolower($html_array_str);
						}
					}
				}
				$html_array_str = ''; // 字符串重置
				$html_tag = 0;
			}else{
				$html_array_str .= $current_var; //将< >之间的字符组成一个字符串,用于提取 html 标签
			}
		}else{
			--$lenth; // 非 html 代码才记数
		}
		$ord_var_c = ord($str{$i});
		switch (true) {
			case (($ord_var_c & 0xE0) == 0xC0): // 2 字节
				$result .= substr($str, $i, 2);
				$i += 1; break;
			case (($ord_var_c & 0xF0) == 0xE0): // 3 字节
				$result .= substr($str, $i, 3);
				$i += 2; break;
			case (($ord_var_c & 0xF8) == 0xF0): // 4 字节
				$result .= substr($str, $i, 4);
				$i += 3; break;
			case (($ord_var_c & 0xFC) == 0xF8): // 5 字节
				$result .= substr($str, $i, 5);
				$i += 4; break;
			case (($ord_var_c & 0xFE) == 0xFC): // 6 字节
				$result .= substr($str, $i, 6);
				$i += 5; break;
			default: // 1 字节
				$result .= $current_var;
		}
	}
	if($html_array['left']){ //比对左右 html 标签,不足则补全
		$html_array['left'] = array_reverse($html_array['left']); //翻转left数组,补充的顺序应与 html 出现的顺序相反
		foreach($html_array['left'] as $index => $tag){
			$key = array_search($tag, $html_array['right']); // 判断该标签是否出现在 right 中
			if($key !== false){ // 出现,从 right 中删除该单元
				unset($html_array['right'][$key]);
			}else{ // 没有出现,需要补全
				$result .= '</'.$tag.'>';
			}
		}
	}
	return $result.$replace;
}
(0)

相关推荐

  • php检查字符串中是否包含7位GSM字符的方法

    本文实例讲述了php检查字符串中是否包含7位GSM字符的方法.分享给大家供大家参考.具体分析如下: 下面的代码检查一个字符串是否包含任何7位GSM字符.它对短信平台上工作的人非常有用. <?php function check_gsm($str) { $arr = array( "0x00", "0x01", "0x02", "0x03", "0x04", "0x05","

  • PHP strstr 函数判断字符串是否否存在的实例代码

    PHP strstr 定义和用法 strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. 语法 strstr(string,search) 参数 描述 string 必需.规定被搜索的字符串. search 必需.规定所搜索的字符串.如果该参数是数字,则搜索匹配数字 ASCII 值的字符. 提示和注释 注释:该函数是二进制安全的. 注释:该函数对大小写敏感.如需进行大小写不敏感的搜索,请使用 st

  • php中判断字符串是否全是中文或含有中文的实现代码

    一,判断全是中文 复制代码 代码如下: $str="'324是"; if(!eregi("[^\x80-\xff]","$str")){ echo "全是中文"; }else{ echo "不是"; } 二,判断含有中文 复制代码 代码如下: $str = "中文"; if (preg_match("/[\x7f-\xff]/", $str)) { echo &quo

  • PHP简单判断字符串是否包含另一个字符串的方法

    本文实例讲述了PHP简单判断字符串是否包含另一个字符串的方法.分享给大家供大家参考,具体如下: 在使用PHP判断某字符串中是否包含一个简单的子字符串的时候,我们通常会用到strpos()或者stristr()这两个函数,可是偏偏如果这个字符串的位置如果是在索引0位置,也就是说在要匹配的字符串的最开始,则会出问题. 当然我们还是有解决的方法的,这里就有一个笨办法,但是比较好用,无论中英文,标点符号都适用. 代码如下: function checkStr($str,$target) { $tmpAr

  • php 正则 不包含某字符串的正则表达式

    常见函数 strstr($str, "abc"); 正则匹配 preg_match("/(abc)?/is", $str); 但是要匹配一个字符串中,不包含某字符串,用正则就比较麻烦了 如果不用正则 !strstr($str, "abc"); 就可以解决问题了 但是用正则呢,就只有这样了,"/^((?!abc).)*$/is" //------------------------------------------------

  • php判断数组元素中是否存在某个字符串的方法

    方法一:采用in_array(value,array,type) type 可选.如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同. 复制代码 代码如下: $arr = array('可以','如何','方法','知道','沒有','不要');//in_array(value,array,type)$isin = in_array("如何2",$arr);if($isin){    echo "in====".$isin;}else{    ec

  • PHP判断一个字符串是否是回文字符串的方法

    本文实例讲述了PHP判断一个字符串是否是回文字符串的方法.分享给大家供大家参考.具体实现方法如下: <?php function ishuiwen($str){ $len=strlen($str); $l=1; $k=intval($len/2)+1; for($j=0;$j<$k;$j++){ if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) { $l=0; break; } } if ($l==1) { return 1; } else {

  • php判断字符以及字符串的包含方法属性

    下面介绍使用方法: 1. strstr: 返回一个从被判断字符开始到结束的字符串,如果没有返回值,则不包含 复制代码 代码如下: <?php /*如手册上的举例*/ $email = 'user@example.com'; $domain = strstr($email, '@'); echo $domain; // prints @example.com ?> 2. stristr: 它和strstr的使用方法完全一样.唯一的区别是stristr不区分大小写. 3. strpos: 返回bo

  • php简单判断两个字符串是否相等的方法

    本文实例讲述了php简单判断两个字符串是否相等的方法.分享给大家供大家参考.具体实现方法如下: <?php function strcomp($str1,$str2){ if($str1 == $str2){ return TRUE; }else{ return FALSE; } } echo strcomp("First string","Second string"); //Returns FALSE echo strcomp("A string

  • php strstr查找字符串中是否包含某些字符的查找函数

    PHP 判断字符串是否包含其它字符 以下几个函数均可用来判断某字符串是否包含另外一个字符串PHP 中判断一个字符串是否包含其它字符是很常见的操作. 虽然很简单,但还是写了几个函数,质量可能不是很高,权当锻炼. 如果这几个函数恰好能帮上你的忙,我将会很高兴的.这几个函数中,我比较喜欢第四个... 复制代码 代码如下: <?php /** * 以下几个函数均可用来判断某字符串是否包含另外一个字符串 * PHP 中判断一个字符串是否包含其它字符是很常见的操作. * 虽然很简单,但还是写了几个函数,质量

  • php 判断字符串中是否包含html标签

    function judgeHtml($str){ if($str != strip_tags($str)){  echo '有'; }else{  echo '无'; }}judgeHtml('<p>a');echo '<br />';judgeHtml('a');输出:有       无

  • php中判断一个字符串包含另一个字符串的方法

    <?php $name = "001x.gif"; $pan = "x"; $con = explode($pan,$name); if (count($con)>1): echo $name."中包含".$pan; else: echo $name."中没有包含".$pan; endif; ?>

  • php判断字符串在另一个字符串位置的方法

    复制代码 代码如下: $email='user@exe.com';        //定义字符串$result=strstr($email,'@');         //返回子字符串echo $result; strstr()函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. 语法 复制代码 代码如下: strstr(string,search)输出结果"@exe.com"

随机推荐