PHP中UTF8中文字符截断程序代码
最简单的字符截取函数是用php自带的substr()
其实,PHP原生就有多charset下字符截取方案,额,所以就是这个样子...??.
Multibyte String Functions函数族中,
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] ) 用来字符串截取
int mb_strlen ( string $str [, string $encoding ] ) 返回字符串长度
但它只支持数字与字母不支持中文
实例
UTF8中文字符截断
代码如下 | 复制代码 |
<?php /* UTF-8中文字符截断程序 */ $str = "123这是测试字符串"; $str1 = "()()"; echo subUTF8str($str,0,3)."<br>"; echo subUTF8str($str,0,4)."<br>"; echo subUTF8str($str1,0,4)."<br>"; echo subUTF8str($str1,0,10)."<br>"; function subUTF8str($str,$start=0,$length=80){ $cur_len = 0; //人理解的字符串长度 $all_len = strlen($str); //机器理解字符串长度 if($length > $all_len) { return $str; } for($i = 0;$i < $all_len;) { if($cur_len == $start) { break; } if (ord($str[$i]) > 127) { $i += 3; }else{ $i += 1; } $cur_len ++; } $start_pos = $i; $temp_pos = $cur_len; for(;$cur_len - $temp_pos < $length;) { if($i >= $all_len) break; if (ord($str[$i]) > 127) { $i += 3; }else{ $i += 1; } $cur_len ++; } $end_pos = $i; return substr($str,$start_pos,$end_pos); } ?> |
改进后我们把它分页,这样可支持ut8与gbk等中文字符截取
代码如下 | 复制代码 |
function substrs($content, $length){ function utf8_trim($str) { |
分页代码
代码如下 | 复制代码 |
<?php //page当前页,num每页的页数 $page=isset($_GET['page'])?intval($_GET['page']):1; $num=5; $conn = mysql_connect('127.0.0.1','root',''); if (!$conn) { die('Could not connect:'.mysql_error()); } mysql_select_db('shop'); //获取记录总数 $total=mysql_num_rows(mysql_query("select * from user")); //计算页数 $pagenum=ceil($total/$num); //限制页数不能超出范围 If($page>$pagenum || $page == 0){ Echo 'Error : Can Not Found The page.'; Exit; } //语句“Select * from table limit 0,10”从table表提取十条信息,0为起点,10为提取的数目 //$offset为起点值,如当前页为第一页,每页5条,起点即为0,同理当前为第二页,起点将为5 $offset=($page-1)*$num; $result=mysql_query("select * from user limit $offset,$num"); while($it=mysql_fetch_array($result)){ echo 'id:'.$it['id'].' name:'.$it['name'].'<br />'; } //显示链接页面切换链接,当前页无链接 for($i=1;$i<=$pagenum;$i++){ $show=($i!=$page)?"<a href='index.php?page=".$i."'>$i</a>":"<b>$i</b>"; echo $show." "; } echo $total.'条记录,每页5条,共'.$pagenum.'页'; mysql_free_result($result); mysql_close($conn); ?> |
实例2
代码如下 | 复制代码 |
<? //function.php 这里是主函数 if($page!=1) |
//conn.php 连接数据库
代码如下 | 复制代码 |
<?php $id=mysql_connect("localhost","root","root")or dir('连接失败:' . mysql_error()); if(mysql_select_db("db_database06",$id)) |
//主程序,将上面俩个文件包含进来,再调用一个php_page()就可完成分页。:)
代码如下 | 复制代码 |
<?php require_once("conn.php"); |
上在的一种是文字分页,比如说上一页,下一页之类的,还有一种数字分页,像1,2,3...之类的,这个比较简单,前者稍微复杂些.最后一种是他们2者结合
代码如下 | 复制代码 |
--> 1 //获取当前页数 |
代码如下 | 复制代码 |
function funcMtel($str)//手机号码正则表达试 |
测试
18678785887
返回为
false
原因分析,查看了发现上面正则只能验证以13,15开头的,自然18开头的是不可以用的
修改后
代码如下 | 复制代码 |
function funcMtel($str)//手机号码正则表达试 |
测试
18678785887
返回为
true
这样就成功了,
总结经验:
像手机号这类都会不断更新号码段了,我们在写函数时把它写成公共函数,这样就可以解决这个问题了。
什么时候会用到递归正则表达式呢? 当然是待匹配的字串中递归地出现某种模式时(貌似废话). 最经典的例子, 就是递归正则处理嵌套括号的问题了.例子如下.
假设你的文本中包含了正确配对的嵌套括号. 括号的深度可以是无限层. 你想捕获这样的括号组.
恕我剧透, 标准答案是这样的:
代码如下 | 复制代码 |
<?php
|
可见, 我们所需要的文本, 已经捕获到$matches[0]中了.
原理
现在思考原理.
上面的正则表达式中的关键点是(?R). (?R)的作用就是递归地替换它所在的整条正则表达式. 在每次迭代时, PHP 语法分析器都会将(?R)替换为”(([^()]+|(?R))*)“.
因此, 具体到上述的例子, 其正则表达式等价于:
代码如下 | 复制代码 |
"/(([^()]+|(([^()]+|(([^()]+)*))*))*)/" |
但是上面的代码只适合深度为3层的括号. 对于未知深度的括号嵌套, 就只好使用这种正则了:
代码如下 | 复制代码 |
"/(([^()]+|(?R))*)/" |
它不但能够匹配无限深度, 还简化了正则表达式的语法. 功能强大, 语法简洁.
现在来细看一下"/(([^()]+|(?R))*)/"是怎样匹配"(a(b(c)d)e)"的:
1."(c)"这部分被正则式 "(([^()]+)*)" 匹配. 请注意, (c) 其实就相当于整个递归的一个缩影, 麻雀虽小五脏俱全, 因此它用到了整个正则表达式.
换言之, 下一步中的(c), 可以使用(?R) 来匹配.
2.(b(c)d)的匹配过程为:
1."("匹配"(";
2."[^()]+"匹配"b";
3. (?R)匹配"(c)";
4."[^()]+"匹配"d";
5.")"匹配")".
根据上面的匹配原理, 不难理解为什么数组的第2个元素$matches[1]与'e'等价. 子串'e'是在最后一次匹配迭代中被捕获. 匹配过程中, 只有最后一次的捕获结果才会保存到数组中.
rex注: 关于这个特性, 可以自行尝试一下, 看看使用正则式([a-z]+[0-9]+)+来匹配字串abc123xyz890, 其捕获结果$1是什么. 注意, 其结果与 Left Longest 原理并不冲突.
如果我们只需要捕获 $matches[0], 可以这样做:
代码如下 | 复制代码 |
<?php
|
所做的改动是捕获括号()改为非捕获捕获括号(?:)了.
还可以进一步完善为:
代码如下 | 复制代码 |
<?php $string = "some text (a(b(c)d)e) more text"; if(preg_match("/((?>[^()]+|(?R))*)/",$string,$matches)) { echo "<pre>"; print_r($matches); echo "</pre>"; } ?> |
这里我们用到了所谓的一次性模式(rex注: 余晟先生译的《精通正则表达式v3.0》中, 谓之”固化分组”. 可参考该书.) PHP手册也推荐只要条件允许, 就尽可能使用这种模式, 以便提升正则表达式的速度.
php中模拟POST提交数据的方法 有城要的朋友可参考一下。1.通过curl函数
代码如下 | 复制代码 |
$post_data = array(); |
2.通过fsockopen
代码如下 | 复制代码 |
$URL=‘http://xxx.xxx.xxx.xx/xx/xxx/top.php'; $post_data['clientname'] = "test08"; $post_data['clientpasswd'] = "test08"; $post_data['submit'] = "ログイン"; $referrer=""; // parsing the given URL $URL_Info=parse_url($URL); // Building referrer if($referrer=="") // if not given use this script as referrer $referrer=$_SERVER["SCRIPT_URI"]; // making string from $data foreach($post_data as $key=>$value) $values[]="$key=".urlencode($value); $data_string=implode("&",$values); // Find out which port is needed - if not given use standard (=80) if(!isset($URL_Info["port"])) $URL_Info["port"]=80; // building POST-request: $request.="POST ".$URL_Info["path"]." HTTP/1.1n"; $request.="Host: ".$URL_Info["host"]."n"; $request.="Referer: $referrern"; $request.="Content-type: application/x-www-form-urlencodedn"; $request.="Content-length: ".strlen($data_string)."n"; $request.="Connection: closen"; $request.="n"; $request.=$data_string."n"; $fp = fsockopen($URL_Info["host"],$URL_Info["port"]); fputs($fp, $request); while(!feof($fp)) { $result .= fgets($fp, 128); } fclose($fp); |
其它的第三方插件
Snoopy 类(2)
sourceforge.net/projects/snoopy/
http://www.redalt.com/xref/trunk/nav.htm?wp-includes/class-snoopy.php.htm
HTTP类(1,2)
http://www.phpclasses.org/browse/download/1/file/5/name/http.php
PEAR HTTP_Request
http://pear.php.net/package/HTTP_Request
Popularity: 74%
curl参考
PHP中的CURL函数库(Client URL Library Function)
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
相关文章
js URLdecode()与urlencode方法支持中文解码
下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24- 一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
- 这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
- 我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
- 在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
- 一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21