PHP如何在页面中原样输出HTML代码

字符串与HTML之间的相互转换主要应用htmlentities()函数来完成。

header("Content-Type: text/html; charset=utf-8");$str="<a href=\"www.107lab.com\">107网站工作室</a>";echo $str;echo "<br>";echo htmlentities($str,ENT_QUOTES,"UTF-8");

运行结果为:

107网站工作室
<a href=”www.107lab.com”>107网站工作室</a>

技巧:在应用此函数对字符串转换成HTML字符串的过程中,设置参数charset的字符集为utf-8,即可以避免在输出中文字符时出现乱码。

htmlentities() 函数把字符转换为 HTML 实体。

提示:要把 HTML 实体转换回字符,请使用 html_entity_decode() 函数。

提示:请使用 get_html_translation_table() 函数来返回 htmlentities() 使用的翻译表。

总结PHP删除字符串最后一个字符的三种方法

总结PHP删除字符串最后一个字符的三种方法_php技巧_脚本之家

一、前言

从数据库中select()读取一对多的信息时,经常需要将取出的数组用某个特定的字符分割,然后拼接成字符串。

常见的语法格式:?

123foreach ($arr as $key => $value) {$arr_str = $arr['x_id'] . ',' . $arr_str;}

foreach ($arr as $key => $value) { $arr_str = $arr[‘x_id’] . ‘,’ . $arr_str; }

假设字符数组 $arr 中的字符分别为?

123arr[0] = 'a';arr[1] = 'b';arr[2] = 'c';

arr[0] = ‘a’; arr[1] = ‘b’; arr[2] = ‘c’;

则,拼接后的 $arr_str 字符串为 a,b,c, 这个时候,就需要我们对最后一位字符’,’进行删除处理。

二、PHP中删除最后一位字符的方法总结:

方法一:?

1substr($arr_str,0,strlen($arr_str)-1);

substr($arr_str,0,strlen($arr_str)-1);

详解:substr()函数语法:string substr ( string $string , int $start [, int $length ] )

           strlen()函数语法:int strlen ( string $string )

本例原理:

        首先使用strlen()函数判断字符串$arr_str的长度,然后使用substr()函数对$arr_str进行截取,截取至$arr_str的倒数第二位。这样就把最后的”,”去掉了。

使用感受:

         不推荐,php中还有更简洁更好用的方式!

方法二:     ?

1substr($arr_str, 0, -1)

substr($arr_str, 0, -1)

详解:直接使用substr()函数倒序裁掉最后一位字符;

使用感受:还是很合适的~~不过,首先你要确定字符串中一定有内容,且最后一位一定不要!

方法三:       
?

1rtrim($arr_str, ",")

rtrim($arr_str, “,”)

详解:rtrim()函数语法:string rtrim ( string $str [, string $character_mask ] )

rtrim — 删除字符串末端的空白字符(或者其他字符)

使用感受:

简直就是为了这个需求准备的!

注意:以上方法对字符串进行操作后,返回操作结果,并不对字符串本身进行改变!记得使用一个变量进行接收结果!

三、总结

以上就是PHP删除字符串最后一个字符的几种方法总结,大家都学会了吗?希望这篇文章对大家的学习或者工作能带来一定的帮助。

Android编程监听网络连接状态改变的方法

Android编程监听网络连接状态改变的方法_Android_脚本之家 这篇文章主要介绍了Android编程监听网络连接状态改变的方法,基于BroadcastReceiver实现针对网络连接状态的监听功能,需要的朋友可以参考下

java

本文实例讲述了Android编程监听网络连接状态改变的方法。分享给大家供大家参考,具体如下:

public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//Toast.makeText(context, intent.getAction(), 1).show();
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo activeInfo = manager.getActiveNetworkInfo();
Toast.makeText(context, “mobile:”+mobileInfo.isConnected()+”\n”+”wifi:”+wifiInfo.isConnected()
+”\n”+”active:”+activeInfo.getTypeName(), 1).show();
} //如果无网络连接activeInfo为null
}

在清单文件中注册 BroadcastReceiver?

12345<receiver android:name=".MyReceiver"><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></intent-filter></receiver>

<receiver android:name=”.MyReceiver”> <intent-filter> <action android:name=”android.net.conn.CONNECTIVITY_CHANGE”/> </intent-filter> </receiver>

要读取网络状态记得要加权限
复制代码 代码如下:<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”/>

PHP服务端 苹果支付(IAP)处理

 公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。

首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。

先上图:

下面我详细的讲一下每一步做些什么,贴出来相应的代码供大家参考。

 第一步: app 调用创建订单接口,创建订单信息,保存下来。

 第二步: app 调用sdk 发起支付,传苹果给的 receipt(票据)和 订单号 给服务端,服务端通过验证receipt 获取订单信息保存

                数据库。至于票据长什么样子,怎么验证,后面贴代码出来。

 第三步: 订阅模式支付,首次支付苹果服务器会异步发送两次通知到服务端,之后你在app端操作的时候也会有通知,比如更                     改套餐,取消订阅等操作都会有通知,这个就比较坑了,如果异步处理的时候没弄清楚。

                很容易出问题,不能每次接收到通知就处理,沙盒模式下通知来的很奇怪,通知有很多状态,要区别开来处理。

  接下来是代码处理流程:php框架+tp 5.02

  首先是同步完成订单时候的验证:

/** * @title 验证支付票据 完成订单接口 */public function verifyReceipt(){    $receipt = Request::instance()->param('receipt');  //票据   $orderSn = Request::instance()->param('orderSn');  /订单号     //判断订单是否存在 检查状态     //写入日志  查看票据格式  记录日志的方法 这个方法不贴出来了    Tool::callAddLog('request-param',json_encode(['receipt'=>$receipt,'orderSn'=>$orderSn]));    //password 是验证秘钥   $jsonItem = json_encode(['receipt-data'=>$receipt, 'password'=>'XXXXXXXXXXXXXXXX']);       //$url= 'https://buy.itunes.apple.com/verifyReceipt';      //正式     $url= 'https://sandbox.itunes.apple.com/verifyReceipt';  //测试      //模拟post提交   下面会贴出来    $result =  Tool::http_post_json($jsonItem,$url);    if($result['status'] !== 0){      //验证失败 返回app错误状态   }    //验证完成加入日志   Tool::callAddLog('verifyReceipt_finish',json_encode($result));    //找出时间最大的数组   $receiptitem = $result['latest_receipt_info'];    //这个是排序的方法  下面回帖出来 苹果会把这个会员往期的订单信息全部返回,需要找出来最近的那一组信息   $item = Tool::arraySort($receiptitem,'purchase_date','desc');    //判断一下过期时间 延长会员时间    $orderThird = $item['transaction_id'];                //本次订阅的订单号    $orderThirdFirst = $item['original_transaction_id'];  //这个是原始订单号    if($orderThird == $orderThirdFirst){                  //首次订阅 两个相等     }else{         //判断过期时间和当前时间比较   expires_date_ms是毫秒单位         if($item['expires_date_ms']/1000 > time()){         }else{           //过期处理  票据失效          }    }   //接下来处理订单业务逻辑,处理订单,修改订单信息,original_transaction_id 把这个单号和存入订单信息, 在异步回调的时候根据这个单号来查找订单信息来判断是哪个用户,苹果票据里面也有产品product_id,是app_store的产品id,不是自己业务的产品id,可以在后台把自己的产品ID和 product_id 关联,处理业务逻辑。 }
//模拟post提交public static function http_post_json($json,$url) {     $ch = curl_init($url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    curl_setopt($ch, CURLOPT_POST, true);    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加,不加会报SSL 错误    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    $response = curl_exec($ch);    $errno = curl_errno($ch);    $errmsg = curl_error($ch);    curl_close($ch);     $data = json_decode($response, true);    return $data;}
//查找最新数据的方法 public static function arraySort($arr,$key,$type='asc'){     $keyArr = []; // 初始化存放数组将要排序的字段值    foreach ($arr as $k=>$v){        $keyArr[$k] = $v[$key]; // 循环获取到将要排序的字段值    }    if($type == 'asc'){        asort($keyArr); // 排序方式,将一维数组进行相应排序    }else{        arsort($keyArr);    }    foreach ($keyArr as $k=>$v){        $newArray[$k] = $arr[$k]; // 循环将配置的值放入响应的下标下    }    $newArray = array_merge($newArray); // 重置下标    return $newArray[0]; // 数据返回}   
public static function http_post_json($json,$url) {     $ch = curl_init($url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    curl_setopt($ch, CURLOPT_POST, true);    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加,不加会报SSL 错误    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    $response = curl_exec($ch);    $errno = curl_errno($ch);    $errmsg = curl_error($ch);    curl_close($ch);     $data = json_decode($response, true);     return $data;}

————————————————————————————————————————————————————————

验证之后返回的状态

验证之前的票据是一个字符串:就是一个字符串

验证之后的信息:这个是重点

到了 这同步主动验证这边就结束了。

下面是异步通知这块:

异步通知的票据可以验证发送到苹果服务器验证一下有效性,也可以不要验证,它本身的信息就够用了。

  通知类型: notification_type 有很多种情况,有些通知接收存入日志,不用处理,

  需要处理的类型:RENEWAL           DID_CHANGE_RENEWAL_STATUS            

  但是 DID_CHANGE_RENEWAL_STATUS 这种通知 在首次订阅的时候 也会发一个过来,这个时候不处理,也就是当参数       auto_renew_status  等于 true 的时候 不处理,其余的时候都是需要处理的通知。

public function applePayReceive(){      $str = file_get_contents('php://input');     //写入通知日志     $jsonItem = json_decode($str,true);         if($jsonItem['notification_type'] == 'RENEWAL' || $jsonItem['notification_type'] == 'DID_CHANGE_RENEWAL_STATUS'){              if($jsonItem['notification_type'] == 'DID_CHANGE_RENEWAL_STATUS'){            if($jsonItem['auto_renew_status'] == 'true'){                //第一次够买的时候 不处理通知              die;        }         $expires_date = $jsonItem['latest_receipt_info']['expires_date'];        $expires_date = $expires_date/1000;         Tool::asynAddLog('request-param',$expires_date.'----'.time());         if($expires_date > time()){         }else{            //时间不对 不处理        }    }      //处理订阅产品的业务逻辑          echo '完成!';die;}

好了,上面是我写的苹果支付所有流程和代码,业务代码部分我去掉了,大家自己写自己的业务逻辑就可以。

看到最后的同志们,我上面有个地方写错了 ,苹果正式环境,第一次购买的时候,异步的两个通知,notification_type 等于DID_CHANGE_RENEWAL_STATUS 这个的时候,auto_renew_status 值有可能不是ture,我开始没弄懂意思,现在我的理解是

等于true是自动续费的意思,就是说用户选择的是连续订阅,而等于false的时候是用户买了产品取消了订阅模式。才会出现这种情况。不是苹果坑,而是自己没理解,

 

其实根本不能用通知的类型来判断是否给用户重置,正确保险的方案是在主动通知的时候把苹果的原始订单号和本次交易的订单号存入订单,异步的时候判断订单是否完成。然后再写业务逻辑。

重点:异步通知有可能收不到,这种情况下,需要把用户首次订阅的凭证存下来,等到用户到期的时候 再去验证一下这个凭证,然后取出订阅相关信息,找到最近的一条,更新会员时间,会员时间用苹果提供的过期时间就可以。

沙盒模式下苹果的通知是乱的,请大家注意,不一定按照文档上面说的时间有规则的发送通知,所以异步通知不能保证业务的完整性,处理业务时一定要把用户首次支付的凭证持久化,以便后续通知收不到的情况,会员到期服务端主动去查询会员是否续费 情况。

PHP implode():数组转字符串

implode() 函数可以将一个一维数组转化为字符串,其语法格式如下:

implode($glue, $array) 或者 implode($array)其中,$glue 用来设置一个字符串,表示使用 $glue 将数组每个元素连接在一起,默认情况下 $glue 为空字符串;$array 为需要转换的数组。

提示:implode() 函数的 $glue 参数是可选的,可以省略。【示例】使用 implode() 函数将数组转换为字符串。

纯文本复制
<?php    $arr = ['C语言中文网','PHP教程','http://c.biancheng.net/php/','implode()函数','数组转字符串'];    $str = implode($arr);    echo $str.'<br>';    $str = implode(' ',$arr);    echo $str.'<br>';    $str = implode(',',$arr);    echo $str.'<br>';    $str = implode('--',$arr);    echo $str.'<br>';?>

运行结果如下:

C语言中文网PHP教程http://c.biancheng.net/php/implode()函数数组转字符串
C语言中文网 PHP教程 http://c.biancheng.net/php/ implode()函数 数组转字符串
C语言中文网,PHP教程,http://c.biancheng.net/php/,implode()函数,数组转字符串
C语言中文网–PHP教程–http://c.biancheng.net/php/–implode()函数–数组转字符串

zend studio在线安装svn的插件

这个,其实真的很简单 ,但是让我纠结了很久。
安装步骤:
1.确保电脑能够上网;
2.打开zend studio,然后选择help->welcome会弹出一个欢迎页面;
3.等待几秒后可以看到右面一栏出现了一排列表,找到svn然后勾选上然后点击上面的”apply changes”按钮,svn开始安装了。

顺便说一句本人用的zend studio9.0做的测试,不知道低版本的行不行。   
原文地址:http://534603172-qq-com.iteye.com/blog/1699658

Linux中配置ftp传输

ftp的配置及使用

1.安装ftp:

  yum install -y vsftpd

出现如图所示,则表示安装成功

2.关闭防火墙:

  service iptables stop

3.创建一个用户用于ftp传输(或者使用已存在的)

  adduser hxc

4.设置密码

  passwd hxcftp  (回车再输入两遍密码)

5.切换到ftp的配置目录:

  cd /etc/vsftpd/

6.编辑该目录下的文件user_list :

  vim user_list

7.编辑里面的内容,将需要的用户添加进该文件夹中,这里增加hxc用户作为ftp使用,使用命令:cat user_list 查看是否添加成功

8.再编辑该目录下的配置文件:

  vim vsftpd.conf 

在该配置文件中增加userlist_deny=NO  后保存退出:

9.重启ftp服务:

  service vsftpd restart

10.在windows的命令窗口中输入命令:ftp 连接的IP地址  回车

如果不知道连接的地址,在Linux中输入:ifconfig  查看

11.然后输入用户名及密码,登陆即可

如果出现如下错误:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died

关于该问题的解决方案https://www.cnblogs.com/sun-flower1314/p/9574732.html

使用 ftp 传输文件至Linux服务器查看:https://www.cnblogs.com/sun-flower1314/p/11226339.html

谢谢!!

 希望各位给出宝贵意见,不甚感激!!

php通过strpos查找字符串出现位置的方法

这篇文章主要介绍了php通过strpos查找字符串出现位置的方法,实例分析了strpos的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

dubbo

本文实例讲述了php通过strpos查找字符串出现位置的方法。分享给大家供大家参考。具体分析如下:

strpos用来查找一个字符串在另一个字符串中首次出现的位置,strpos区分大小写,如果没有找到则返回false,所以strpos有两种类型的返回值,一种是整形,一种是bool型,开发过程中需要注意

123<?phpecho strpos("Hello world!","wo");?>

输出结果:6

由于strpos有两种类型的返回值,所以在判断是否找到子字符串的的时候最好使用===三个等号进行严格类型的相等比较

1234567891011121314<?php$haystack = "needle23423432";$pos = strpos($haystack, "needle");if ($pos==false) {print("Not found based (==) test\n");} else {print("Found based (==) test\n");}if ($pos===false) {print("Not found based (===) test\n");} else {print("Found based (===) test\n");}?>

上面的代码返回如下结果

123456This script will print: Not found based (==) testFound based (===) test The (===) test is correct.

希望本文所述对大家的php程序设计有所帮助。

有以下几种bai方法:

stripos() 返回字符串在另一字du符串zhi中第一次出现的位置(大小写不敏感dao)

stristr() 查找字符串在另一字符串中第一次出现的位置(大小写不敏感)

strpos() 返回字符串在另一字符串中首次出现的位置(对大小写敏感)

strrchr() 查找字符串在另一个字符串中最后一次出现的位置。

strripos() 查找字符串在另一字符串中最后出现的位置(对大小写不敏感)

strrpos() 查找字符串在另一字符串中最后出现的位置(对大小写敏感)

扩展资料:

PHP常用函数:

strtoupper()函数把字符串转换为大写

strtolower()函数把字符串转换为小写

strtok()函数把字符串分割为更小的字符串

strstr()函数搜索一个字符串在另一个字符串中的第一次出现

strspn()函数返回在字符串中包含的特定字符的数目

strrpos()函数查找字符串在另一个字符串中最后一次出现的位置

strripos()函数查找字符串在另一个字符串中最后一次出现的位置

h5仿微信聊天功能|仿微信界面|weUI仿微信界面、红包

使用h5开发的仿微信原生app聊天界面实战案例,用到了最新混合h5+css3+zepto+weui+wcPop+swiper等技术进行开发,实现了滑动查看大图、视频及发送消息、表情、动图,打赏、霸屏、发红包,模拟微信支付键盘等功能,长按消息可以弹出操作菜单。界面精美、效果棒棒哒~

5b6d93740001092a00200020.jpg

[代码]xml代码:

<!-- //微聊消息上墙面板 -->
<div class="wc__chatMsg-panel flex1">
	<div class="wc__slimscroll2">
		<div class="chatMsg-cnt">
			<ul class="clearfix" id="J__chatMsgList">
				<li class="time"><span>2017年12月28日 晚上21:10</span></li>
				<li class="notice"><span>"<a href="#">Aster</a>"通过扫描"<a href="#">张小龙</a>"分享的二维码加入群聊</span></li>
				<li class="time"><span>2017年12月28日 晚上23:15</span></li>
				<li class="notice"><span>"<a href="#">雷军</a>"通过扫描"<a href="#">李彦宏</a>"分享的二维码加入群聊</span></li>
				<li class="notice"><span>当前群聊人数较多,已显示群成员昵称,同时为了信息安全,请注意聊天隐私</span></li>

				<li class="time"><span>2017年12月31日 晚上22:30</span></li>
				<!-- 别人-->
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img01.jpg" /></a>
					<div class="content">
						<p class="author">马云(老子天下第一)</p>
						<div class="msg">
							hello 各位女士、先生,欢迎大家来到达摩派,进群后记得修改备注哈~~ 名字+公司/职业/机构 <img class="face" src="img/emotion/face01/29.png"><img class="face" src="img/emotion/face01/71.png"><img class="face" src="img/emotion/face01/75.png">
						</div>
					</div>
				</li>
				<!--自己-->
				<li class="me">
					<div class="content">
						<p class="author">Nice奶思</p>
						<div class="msg">
							么么哒,马总发个红包呗!
						</div>
					</div>
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img14.jpg" /></a>
				</li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img02.jpg" /></a>
					<div class="content">
						<p class="author">MR(马蓉  ㈱)</p>
						<div class="msg">
							马总,晚上好哇,还木休息呢。我还在景区度假呢,棒棒! <img class="face" src="img/emotion/face01/69.png">
						</div>
					</div>
				</li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img02.jpg" /></a>
					<div class="content">
						<p class="author">MR(马蓉  ㈱)</p>
						<div class="msg picture">
							<img class="img__pic" src="img/placeholder/wchat__img03.jpg" />
						</div>
					</div>
				</li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img12.jpg" /></a>
					<div class="content">
						<p class="author">Flowers(杨迪)</p>
						<div class="msg">
							哼,要红包。 <img class="face" src="img/emotion/face01/63.png">
						</div>
					</div>
				</li>
				<li class="time"><span>1月1日 早上02:00</span></li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img04.jpg" /></a>
					<div class="content">
						<p class="author">Xlong(张小龙)</p>
						<div class="msg">
							小程序后台新增推广功能,支持开发者添加与业务相关的自定义关键词!<br>
							<a >https://mp.weixin.qq.com/cgi-bin/wx</a>
						</div>
					</div>
				</li>
				<li class="me">
					<div class="content">
						<p class="author">Nice奶思</p>
						<div class="msg">
							小龙哥好敬业哇,牛牛牛!<img class="face" src="img/emotion/face01/79.png">
						</div>
					</div>
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img14.jpg" /></a>
				</li>
				<li class="me">
					<div class="content">
						<p class="author">Nice奶思</p>
						<div class="msg video">
							<img class="img__video" src="img/placeholder/wchat__video02-poster.jpg" videoUrl="img/placeholder/wchat__video02-Y7qk5uVcNcFJIY8O4mKzDw.mp4" />
						</div>
					</div>
					<a class="avatar" href="好友主页(详细资料).html">
						<img src="img/uimg/u__chat-img14.jpg" />
					</a>
				</li>
				<li class="time"><span>2月25日 早上09:48</span></li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img06.jpg" /></a>
					<div class="content">
						<p class="author">Robin(李彦宏)</p>
						<div class="msg">
							早上好,各位,这次人机交互线下活动的视频及PPT预计明天可以公开啦 <img class="face" src="img/emotion/face01/4.png">
						</div>
					</div>
				</li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img15.jpg" /></a>
					<div class="content">
						<p class="author">King(李嘉诚)</p>
						<div class="msg">
							这个不错,支持下~ <img class="face" src="img/emotion/face01/42.png">
						</div>
					</div>
				</li>
				<li class="time"><span>3月12日 下午14:28</span></li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img03.jpg" /></a>
					<div class="content">
						<p class="author">Jay(周杰伦)</p>
						<div class="msg">
							我的新专辑《告白气球》将于6.1上线,到时希望大家多多支持啦~ <img class="face" src="img/emotion/face01/66.png">
						</div>
					</div>
				</li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img11.jpg" /></a>
					<div class="content">
						<p class="author">Luci(王巧巧)</p>
						<div class="msg picture">
							<img class="img__pic" src="img/placeholder/wchat__img01.jpg" />
						</div>
					</div>
				</li>
				<li class="time"><span>"马云(老子天下第一)" 撤回了一条消息</span></li>
				<li class="others">
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img11.jpg" /></a>
					<div class="content">
						<p class="author">Luci(王巧巧)</p>
						<div class="msg video">
							<img class="img__video" src="img/placeholder/wchat__video01-poster.jpg" videoUrl="img/placeholder/wchat__video01-Y7qk5uVcNcFJIY8O4mKzDw.mp4" />
						</div>
					</div>
				</li>
				<li class="time"><span>"Luci(王巧巧)" 已被移出群聊</span></li>
				<li class="me">
					<div class="content">
						<p class="author">Nice奶思</p>
						<div class="msg picture">
							<img class="img__pic" src="img/placeholder/wchat__img02.jpg">
						</div>
					</div>
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img14.jpg" /></a>
				</li>
				<li class="me">
					<div class="content">
						<p class="author">Nice奶思</p>
						<div class="msg">
							北京新世纪饭店发放福利啦,免费领取VIP会员,大家快去参与吧。
						</div>
					</div>
					<a class="avatar" href="好友主页(详细资料).html"><img src="img/uimg/u__chat-img14.jpg" /></a>
				</li>
			</ul>
		</div>
	</div>
</div>

[代码]js代码:

// ...表情、选择区切换
$(".wc__editor-panel").on("click", ".btn", function(){
	var that = $(this);
	$(".wc__choose-panel").show();
	if (that.hasClass("btn-emotion")) {
		$(".wc__choose-panel .wrap-emotion").show();
		$(".wc__choose-panel .wrap-choose").hide();
		// 初始化swiper表情
		!emotionSwiper && $("#J__emotionFootTab ul li.cur").trigger("click");
	} else if (that.hasClass("btn-choose")) {
		$(".wc__choose-panel .wrap-emotion").hide();
		$(".wc__choose-panel .wrap-choose").show();
	}
	wchat_ToBottom();
});

// ...处理编辑器信息
var $editor = $(".J__wcEditor"), _editor = $editor[0];
function surrounds(){
	setTimeout(function () { //chrome
		var sel = window.getSelection();
		var anchorNode = sel.anchorNode;
		if (!anchorNode) return;
		if (sel.anchorNode === _editor ||
			(sel.anchorNode.nodeType === 3 && sel.anchorNode.parentNode === _editor)) {
			
			var range = sel.getRangeAt(0);
			var p = document.createElement("p");
			range.surroundContents(p);
			range.selectNodeContents(p);
			range.insertNode(document.createElement("br")); //chrome
			sel.collapse(p, 0);
			
			(function clearBr() {
				var elems = [].slice.call(_editor.children);
				for (var i = 0, len = elems.length; i < len; i++) {
					var el = elems[i];
					if (el.tagName.toLowerCase() == "br") {
						_editor.removeChild(el);
					}
				}
				elems.length = 0;
			})();
		}
	}, 10);
}
// 格式化编辑器包含标签
_editor.addEventListener("click", function () {
	//$(".wc__choose-panel").hide();
}, true);
_editor.addEventListener("focus", function(){
	surrounds();
}, true);
_editor.addEventListener("input", function(){
	surrounds();
}, false);
// 点击表情
$("#J__swiperEmotion").on("click", ".face-list span img", function(){
	var that = $(this), range;

	if(that.hasClass("face")){ //小表情
		var img = that[0].cloneNode(true);
		_editor.focus();
		_editor.blur(); //输入表情时禁止输入法

		setTimeout(function(){
			if(document.selection && document.selection.createRange){
				document.selection.createRange().pasteHTML(img);
			}else if(window.getSelection && window.getSelection().getRangeAt){
				range = window.getSelection().getRangeAt(0);
				range.insertNode(img);
				range.collapse(false);

				var sel = window.getSelection();
				sel.removeAllRanges();
				sel.addRange(range);
			}
		}, 10);
	}else if(that.hasClass("del")){ //删除
		_editor.focus();
		_editor.blur(); //输入表情时禁止输入法

		setTimeout(function(){
			range = window.getSelection().getRangeAt(0);
			range.collapse(false);

			var sel = window.getSelection();
			sel.removeAllRanges();
			sel.addRange(range);
			document.execCommand("delete");
		}, 10);
	}
});
5b6d93740001471103750667.jpg
5b6d937400010da003750667.jpg
5b6d93750001cbf703750667.jpg
5b6d937500018ebc03750667.jpg
5b6d937500015ae403750667.jpg
5b6d93760001cba803750667.jpg
5b6d93760001e35f03750667.jpg
5b6d937600016b5703750667.jpg
5b6d9377000187e703750667.jpg

原文链接:http://www.apkbus.com/blog-709961-77897.html