匹配中文有一些在编辑上的区别,如果我们不加以判断在不同编辑下匹配中文字节字符是不一样的,这是很多初学者在网上找找之后发现很多代码不能正确使用的原因所在了。
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的不同的地方就是,前者匹配一次就完了(无论是否匹配成功),而后者,会从待匹配的字符串的开头到结尾匹配一遍。
今天在做一个功能时因为以前我们填写的内容中有数字与中文了,但现在改版了只要数字了,使用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];
|
发现这个可以获取任意连续长度的数字了,当然在网上还看到很多,但有一个可以了所以就没有再测试了。
正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。
代码如下 |
复制代码 |
例子
function getpic($str){
preg_match_all("//isU",$str,$ereg);//正则表达式把图片的整个都获取出来了
$img=$ereg[0][0];//图片
$p="#src=('|\")(.*)('|\")#isU";//正则表达式
preg_match_all ($p, $img, $img1);
$img_path =$img1[2][0];//获取第一张图片路径
// print_r($img_path);
return $img_path;
}
$imgs=getpic($row['post_content']);
$row['post_content'] //获取数据库里面的文章的内容。
|
在php中正则数字只要带D就可匹配出来了,下面我来做几个例子,用来检测字符串中数字然后提取出来,有需要的朋友可进入参考。
今天开发采集器,用到从字符串里取数字,后来想到了以下用正则表达式来取。
用正则
代码如下 |
复制代码 |
$str = ereg_replace(‘[^0-9]‘,”,$str);和
$str = preg_replace( ‘/[^\d]/ ‘, ‘ ‘,$str);
|
例子
代码如下 |
复制代码 |
function findNum($str=''){
$str=trim($str);
if(empty($str)){return '';}
$reg='/(\d{3}(\.\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 '';
}
|
如果是小数点呢,我们上面办法显然是不正确的,我们可以进行修改
代码如下 |
复制代码 |
$regexp = '/(\d+)\.(\d+)/is';
<?php
$total = "42.234 EUR 53.218 AUD CAD97.164 311.151 MYR 125.042 NZD GBP84.270 SGD60.227 USD134.400";
preg_match_all('/(\d+)\.(\d+)/is', $total, $arr);
var_export($arr);
?>
|
结果是我们相要的哦,不信你去试一下吧。
正则字母与数字是php正则表达式中最为简单也是常用的一个功能了,如果是单数字我们只要判断intval就可以了,如果是单字母也可以简单的W就可以判断了,但是组合的话有一点不一样,下面我们一起来学习一下吧。
数字正则过滤
代码如下 |
复制代码 |
if(preg_match("/^\d*$/",$yebihai))
echo('是数字');
else
echo('不是数字');
或者用函数
if(is_numeric($yebihai))
echo('是数字');
else
echo('不是数字');
|
这两种方法的区别是 is_numeric小数也会认为是数字,而前面正则会把小数点当作字符。
正则表达式如下 数字和字母 :
代码如下 |
复制代码 |
$password='abc12';
if(!preg_match("/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i",$password)){
echo '密码必须由数字和字母的组合而成';
}
|
如果要限制长度6-15位的英文字符和数字
只要加个strlen来进行判断就可以了 如下$plen<6||$plen>15
代码如下 |
复制代码 |
$password='abc123';
$plen=strlen($password);
if(!preg_match("/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i",$password)||$plen<6||$plen>15){
echo '密码必须为6-15位的数字和字母的组合';
}
|
其实我们还可以直接使用正则来限制长度
关于长度我们可参考一下规则.
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
上面是数字了,我们组合验证也只要在后面加一个{}就可以了。
代码如下 |
复制代码 |
$password='abc123';
$plen=strlen($password);
if(!preg_match("/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*{8,}$/i",$password)||$plen<6||$plen>15){
echo '密码必须为8位的数字和字母的组合';
}
|
//长度是8或更多 其实就是在正则后面加了一句{8,}就可以了,
标签:[!--infotagslink--]