PHP正则匹配字符串中的中文

 更新时间:2016年11月25日 16:22  点击:1264
本文章总结了php中利用正则表达式来匹配中文的一些实例函数,有需要的朋友可参考参考。

我们先要明白
中文双字节字符编码范围

1. GBK (GB2312/GB18030)
x00-xff GBK双字节编码范围
x20-x7f ASCII
xa1-xff 中文 gb2312
x80-xff 中文 gbk

2. UTF-8 (Unicode)

u4e00-u9fa5 (中文)
x3130-x318F (韩文
xAC00-xD7A3 (韩文)
u0800-u4e00 (日文)

获取指定的中文与字符
例1

 代码如下 复制代码
<?php
$str = '正则如何匹配中文字在某中文字符串中?';
preg_match("/中/",$str,$regs);
print_r($regs);
?>

输出
Array
(
    [0] => 中
)

例2

 代码如下 复制代码

<?php
$str = '这里是中文 this is English';
//把中文变成红色
echo preg_replace("/([x80-xff].)/","<font color=red>\1</font>",$str);
//把非中文变成红色
echo preg_replace("/([x20-x7f])/","<font color=red>\1</font>",$str);
?>


 

签里面有中文、英文、数字等混排,则需要对汉字进行特殊处理,由于PCRE不支持U P L之类的perl字符串处理转义,使用16进制或者Unicode进行处理,范例如下:

 代码如下 复制代码


$str = "之二宽阔的甘家口东#标签1#标签2 #标签3。#标签4,都发$1234 ¥xc,cvm , ¥12,dflksjf如何#标签5.x #tag6.cvxcv“";
preg_match_all('/#([a-zA-Z0-9x7f-xff]+)/', $str, $mat);
print_r($mat);

preg_match("/[x{00a5}x{ffe5}](d+)/u", $str, $mat);
print_r($mat);


最后我明白了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[x{4e00}-x{9fa5}]+$/u

 代码如下 复制代码

$str = "php编程";
if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}


实例

下面这款匹配中文字符串正则表达式是一款利用数组,然后 多次for把全是中文字符串的打印出来。
*/
 

 代码如下 复制代码

$str_arr = array(
"iameverysorry",
"快乐编程,快乐生活",
"php教程编程",
"1997年香港回归",
"英语学习abc",
"www.111cn.net"
);

$patt_ch = chr(0xa1) . "-" . chr(0xff);

foreach ($str_arr as $str)
{
    echo "字符串'$str' 是";
    if (preg_match("/^[$patt_ch]+$/", $str))
    {
        echo "<b>完全中文</b>";
        echo "<br>";
        echo "<br>";
    }
    else
    {
        echo "非完全中文";
        echo "<br>";
        echo "<br>";
    }
}

更多详细内容请查看:http://www.111cn.net/phper/php-cy/34301.htm

在php中要实现上传进度条有很多方法,如ajax是现在的主流或利用iframe来实现,现在我们来介绍php的apc与uploadprogress实现文件上传进度条效果。

 

目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩展模块 uploadprogress实现(http://pecl.php.net/package/uploadprogress)我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改。

 
APC实现方法:
 
安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明
配置php.ini,设置参数 apc.rfc1867=1 ,使APC支持上传进度条功能,在APC源码说明文档里面有说明
代码范例:
 

 代码如下 复制代码
if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上传请求
    $status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
    $status['done'] = 1;
    echo json_encode($status);  //输出给用户端页面里的ajax调用,相关文档请自己寻找
    exit;
} elseif (isset($_GET['progress_key'])) {   //读取上传进度
    $status = apc_fetch('upload_'.$_GET['progress_key']);
    echo json_encode($status);
    exit;
} else {
    //其他代码,比如上传表单等
}

uploadprogress 模块实现方法:
使用PECL模块安装方法安装该模块
php.ini里面设置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”

代码范例:

 代码如下 复制代码

if($_SERVER['REQUEST_METHOD']=='POST') {
    if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
        $upload_dir = 'your_path/';
        $ext        = strrchr($_FILES['video']['name'], '.');
        $sessid     = $_POST['UPLOAD_IDENTIFIER'] ;
        $tmpfile    = $upload_dir . $sessid; 
        $sessfile   = $upload_dir . $sessid .$ext;
        if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {
            //上传成功
        } else {
            //上传失败
    } else {
        //上传错误
       
} elseif (!empty($_GET['sessid'])) {
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-Type:text/html;charset=UTF-8");
 
    $unique_id = $_GET['sessid'];
    $uploadvalues = uploadprogress_get_info($unique_id);
 
    if (is_array($uploadvalues)) {
        echo json_encode($uploadvalues);
    } else {
        //读取进度失败,另外处理逻辑
    }
   
} else {
    //显示上传表单
}


整合

现在剩下的只是要把所有内容 hook 到一起。您可以通过 progress.php 页面来完成此操作。


清单 5. 最终的 progress.php 页面
               

 代码如下 复制代码

<?php
   $id = uniqid("");
?>
<html>
<head><title>Upload Example</title></head>
<body>

<script src="http://maps.google.com/maps?file=api&v=2&key=<yourkeyhere>"
            type="text/javascript"></script>

<script type="text/javascript">

function getProgress(){
  GDownloadUrl("getprogress.php?progress_key=<?php echo($id)?>",
               function(percent, responseCode) {
                   document.getElementById("progressinner").style.width = percent+"%";
                   if (percent < 100){
                        setTimeout("getProgress()", 100);
                   }
               });

}

function startProgress(){
    document.getElementById("progressouter").style.display="block";
    setTimeout("getProgress()", 1000);
}

</script>

<iframe id="theframe" name="theframe"
        src="upload.php?id=<?php echo($id) ?>"
        style="border: none; height: 100px; width: 400px;" >
</iframe>
<br/><br/>

<div id="progressouter" style=
   "width: 500px; height: 20px; border: 6px solid red; display:none;">
   <div id="progressinner" style=
       "position: relative; height: 20px; background-color: purple; width: 0%; ">
   </div>
</div>

</body>
</html>

 


从底层开始向上层工作,我们已经添加了嵌入清单 1 中的 upload.php 脚本的 iframe,给它提供了在页面顶部生成的惟一 ID。

现在,是否还记得该表单中的 Submit 按钮?

 代码如下 复制代码
<input onclick="window.parent.startProgress(); return true;"
 type="submit" value="Upload!"/>

 


该按钮将完成两项工作。提交表单,像普通的 Submit 按钮一样;但在执行该操作之前,它将在主窗口中调用 startProgress() 脚本。startProgress() 脚本将告诉进度条显示自身 —— 开始时无显示属性,然后告诉浏览器等待一秒,然后再执行 getProgress() 脚本。

现在,getProgress() 脚本将使事情变得有趣。记不记得在前面我说过将需要使用 Ajax 或某种类似的方法来检查文件的进度?对,在本例中,表单将采用捷径,调用来自 Google Maps API 库的 GdownloadUrl() 函数(注意,表单将导入位于页面顶部的库。您将需要获得自己的访问此库的密钥,但是它是从 Google 免费获取的)。

此函数将下载 URL 的内容 —— 本例中为 getprogress.php 脚本 —— 并执行在其中定义的匿名函数。函数所接受的第一个参数是从 URL 返回的数据,本例中为百分比,以便使用它更新进度条。最后,如果文件尚未完成下载,则告诉浏览器每十分之一秒重试一次(在实际情况中,可能无法那么快地执行这些调用,但是浏览器将尽其所能进行操作)。

最终结果是页面使用户可以查看文件正被上传的进度。


如果文件太大了我们可以如下操作:

PHP限制上传文件大小第一:

在php.ini里面查看如下行:

upload_max_filesize = 8M

post_max_size = 10M

memory_limit = 20M

把这些值改成我所说的,看看有没有问题,另外要确认上传的 <form> 里没有类似下面的这行

<input type="hidden" name="MAX_FILE_SIZE" value="500000">这样也是限制上传大小用的。

PHP限制上传文件大小第二:

如果是apache 2 需要修改

/etc/httpd/conf.d/php.conf

中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)

在PHP限制上传文件大小之后,文件上传就不会出现如上问题,上传不响应,上传现实该页无法现实也将得到解决!

 

今天在安装Pdo_MySQL模块时提示PDO_MYSQL make: *** [pdo_mysql.lo]之类的错误,下面来看解决办法。

编译安装PDO_MYSQL拓展模块,总是提示 PDO_MYSQL make: *** [pdo_mysql.lo] Error 1 下 /software/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:25:19: error: mysql.h: No such file or directoryIn file included from /software/PDO_MYSQL-1.0.2/pdo_mysql.c:31:


解决办法:

通过软连接把MySQL头文件对应到/usr/local/include/下就好


比如你的MySQL安装文件位于/usr/local/mysql,那么就执行以下命令:

 代码如下 复制代码

# ln -s /usr/local/mysql/include/* /usr/local/include/

解决办法二

 代码如下 复制代码

yum install mysql-devel
[root@cms-test PDO_MYSQL-1.0.2]# make install

三、修改php.ini;

 代码如下 复制代码
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension = "pdo_mysql.so"
curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。

是把PHP的主页取回放到一个文件中。

例 1. 使用PHP的CURL模块取回PHP主页

 代码如下 复制代码
<?php
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/phpinfo.php");
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出
 $result=curl_exec($ch);
 curl_close($ch);


2,使用代理进行抓取

为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。

 

 代码如下 复制代码
<?php
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
 curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);
 //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密码的话,加上这个
 $result=curl_exec($ch);
 curl_close($ch);
 ?>

3,post数据后,抓取数据

单独说一下数据提交数据,因为用 curl的时候,很多时候会有数据交互的,所以比较重要的。

 代码如下 复制代码

<?php
 $ch = curl_init();
 /*在这里需要注意的是,要提交的数据不能是二维数组或者更高
 *例如array('name'=>serialize(array('tank','zhang')),'sex'=>1,'birth'=>'20101010')
 *例如array('name'=>array('tank','zhang'),'sex'=>1,'birth'=>'20101010')这样会报错的*/
 $data = array('name' => 'test', 'sex'=>1,'birth'=>'20101010');
 curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/upload.php');
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_exec($ch);
 ?>在 upload.php文件中,print_r($_POST);利用curl就能抓取出upload.php输出的内容Array ( [name] => test [sex] => 1 [birth] => 20101010 )

4,抓取一些有页面访问控制的页面

页面访问控制的3种方法

页面访问控制的3种方法张映 发表于 2010-10-12

分类目录: apache/nginx
我们经常会看到这种现象,看下图


apache 页面访问控制
为什么要进行这样的控制呢,给不同的人看不同的东西,对信息进行保护,虽然这种保护比较低级,多多少少还是有点用的。

一,用htpasswd命令,产生权限控制文件

 代码如下 复制代码

查看复制打印?
1.[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看  
2.New password:            //提示输入密码  
3.Re-type new password:        //重复密码  
4.Adding password for user tank  
5.[zhangy@BlackGhost test]$ cat access    //查看一下密码文件  
6.tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。 
[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看
New password:            //提示输入密码
Re-type new password:        //重复密码
Adding password for user tank
[zhangy@BlackGhost test]$ cat access    //查看一下密码文件
tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。到这儿密码文件是生成好了。

二,页面访问控制方法

1,能过修改httpd.conf或者是httpd-vhosts.conf来进行配置

 

 代码如下 复制代码

listen 10004
NameVirtualHost *:10004
<VirtualHost *:10004>
 DocumentRoot "/home/zhangy/www/test"
 ServerName *:10004
 BandwidthModule On
 ForceBandWidthModule On
 Bandwidth all 1024000
 MinBandwidth all 50000
 LargeFileLimit * 500 50000
 MaxConnection all 2

 ErrorLog "/home/zhangy/apache/blog.51yip.com.com-error.log"
 CustomLog "/home/zhangy/apache/blog.51yip.com-access.log" common
//看一下,下面的配置
 <Directory /home/zhangy/www/test>
 AuthType Basic
 AuthName "access test"
 AuthUserFile /home/zhangy/www/test/access
 Require valid-user
 </Directory>

</VirtualHost>

2,我们可以利用.htaccess文件来进行控制

在test的根目录下面建一个.htaccess的文件

 代码如下 复制代码

[zhangy@BlackGhost test]$ vi .htaccess&nbsp;&nbsp; //打开个文件 ,添加权限内容
[zhangy@BlackGhost test]$ cat .htaccess&nbsp; //下面就是.htaccess的内容
 AuthType Basic
 AuthName "access test"
 AuthUserFile /home/zhangy/www/test/access
 Require valid-user

3,不用密码文件,也可以进行访问控制

 代码如下 复制代码

define('ADMIN_USERNAME','tank'); &nbsp;&nbsp; &nbsp;// Admin Username
define('ADMIN_PASSWORD','tank'); &nbsp;&nbsp;&nbsp; &nbsp;// Admin Password

//log check
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
 $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
 Header("WWW-Authenticate: Basic realm="access test"");
 Header("HTTP/1.0 401 Unauthorized");

 echo &lt;&lt;&lt;EOB
 &lt;html&gt;&lt;body&gt;
 &lt;h1&gt;Rejected!&lt;/h1&gt;
 &lt;big&gt;Wrong Username or Password!&lt;/big&gt;
 &lt;/body&gt;&lt;/html&gt;
EOB;
 exit;
}

curl相关函数列表:

curl_init — 初始化一个CURL会话
curl_setopt — 为CURL调用设置一个选项
curl_exec — 执行一个CURL会话
curl_close — 关闭一个CURL会话
curl_version — 返回当前CURL版本
curl_init — 初始化一个CURL会话
描述
int curl_init ([string url])
curl_init()函数将初始化一个新的会话,返回一个CURL句柄供 curl_setopt(), curl_exec(),和 curl_close() 函数使用。如果可选参数被提供,那么CURLOPT_URL选项将被设置成这个参数的值。你可以使用curl_setopt()函数人工设置。

例 1. 初始化一个新的CURL会话,且取回一个网页

 代码如下 复制代码

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, “http://www.zend.com/”);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
curl_close ($ch);
?>

我们来介绍一下关于ThinkPHP访问不存在的模块跳到404页面 有需要的朋友可参考参考。

在ACTION中新建一个文件EmptyAction.class.php,文件中的代码如下:

 代码如下 复制代码

<?php
class EmptyAction extends Action{
    function _empty(){
        header("HTTP/1.0 404 Not Found");//使HTTP返回404状态码
        $this->display("Public:404");
    }
}
?>

在apache中设置

在你的网站配置中加入 ErrorDocument 404 /404.html 即可。


在iis中设置

IIS/ASP.net下设置404错误页面

打开apache httpd.conf配置文件或者新建.htaccess配置文件


首先,修改应用程序根目录的设置,打开 “web.config” 文件编辑,在其中加入如下内容:

 代码如下 复制代码

<configuration>
<system.web>
<customErrors mode=”On” defaultRedirect=”error.asp”>
<error statusCode=”404″ redirect=”notfound.asp” />
</customErrors>
</system.web>
</configuration>

注:上文例中“error.asp”为系统默认的404页面,“notfound.asp”为自定义的404页面,使用时请修改相应文件名。
然后,在自定义的404页面“notfound.asp”中加入:

 代码如下 复制代码

<%
Response.Status = “404 Not Found”
%>


php 404

 代码如下 复制代码

 if(如果没有任何结果)
    {
    //以前是仅仅显示“该帖子已经不存在”的提示,现在是:
    require(’/404.php’);
    @header(’HTTP/1.1 404 Not Found’);
    @header(’Status: 404 Not Found’);
    exit;
    }

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • PHP正则匹配img及标签各属性值(匹配图片函数)

    有一个项目要获取页面中所有img标签中的图片地址,这里我们使用到了preg_match_all正则函数,然后看我下面的一些参数即可实现了。 例 代码如下 复制代码 ...2016-11-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 解决vue字符串换行问题(绝对管用)

    这篇文章主要介绍了解决vue字符串换行问题(绝对管用),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-06
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25