这个php的正则表达式匹配中文,为什么输出的只有2个?

php正则表达匹配中文若干问题的解决方法
在php中,用正则表达式匹配中文的例子:
复制代码 代码示例:
$str = '中华人民共和国abcdefg';
preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName);
运行以上代码,会提示:
Warning: preg_match(): Compilation failed: PCRE does not
support L, l, N, P, p, U, u, or X at offset 3 in
F:wwwrootphptest.php on line 2
原因在于:PHP正则表达式中不支持下列 Perl 转义序列:L, l, N, P, p, U, u, or X
在 UTF-8 模式下,允许用“x{...}”,花括号中的内容是表示十六进制数字的字符串。
原来的十六进制转义序列 xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
解决方法:
复制代码 代码示例:
preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName);
preg_match('/[x{2460}-x{2468}]/u', $str);
匹配 内码汉字
按照他提供的方式进行测试:
复制代码 代码示例:
$str = "php编程";
if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) {
print("该字符串全部是中文");
print("该字符串不全部是中文");
这样操作,依然对是否为中文判断失常。不过,既然x表示的十六进制数据,为什么和js里边提供的范围x4e00-x9fa5不一样呢?
于是将代码修改为如下内容:
复制代码 代码示例:
$str = "php编程";
if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) {
print("该字符串全部是中文");
print("该字符串不全部是中文");
warning又一次产生了:
Warning: preg_match() [function.preg-match]: Compilation
failed: invalid UTF-8 string at offset 6 in test.php on line
接着修改,给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现这次准确了:
复制代码 代码示例:
$str = "php编程";
if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
print("该字符串不全部是中文");
知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式:
/^[x{4e00}-x{9fa5}]+$/u,
最终版的实现代码:
复制代码 代码示例:
//if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str))
{ //只能在GB2312情况下使用
if (preg_match(“/^[x7f-xff]+$/”, $str)) {
//兼容gb2312,utf-8
echo “正确输入”;
echo “错误输入”;
复制代码 代码示例:
$action = trim($_GET['action']);
if($action == "sub")
$str = $_POST['dir'];
//if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str))
//GB2312汉字字母数字下划线正则表达式
if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str))
//UTF-8汉字字母数字下划线正则表达式
echo"&font
color=red&您输入的[".$str."]含有违法字符&/font&";
&echo "&font
color=green&您输入的[".$str."]完全合法,通过!&/font&";
&form method="POST"
action="?action=sub"&
输入字符(数字,字母,汉字,下划线):
&input type="text" name="dir"
&input type="submit"
value="提交"&
附,php中双字节字符编码范围
1. GBK (GB2312/GB18030)
x00-xff GBK双字节编码范围
x20-x7f ASCII
xa1-xff 中文 gb2312
x80-xff 中文 gbk
2. UTF-8 (Unicode)
u4e00-u9fa5 (中文)
xAC00-xD7A3 (韩文)
就介绍这些吧,希望有助于大家理解php正则匹配中文的方法。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。PHP 正则表达式详细教程 | 程序员书库 | PHP教程
程序员书库
PHP 正则表达式详细教程更新时间:&&&阅读人数:198&&&文章综合评分:1.64
正则表达式是一个非常有用的功能。它提供了查找,匹配,替换句子、单词或者其他格式的字符串。正则表达式的基本语法:一个正则表达式,分为三个部分:分隔符,表达式和修饰符。PHP 正则表达式介绍
分隔符是"/",两个双斜杠内为表达式。即“/表达式/”。
表达式:匹配规则,正则表达式中的特殊字符分为元字符、定位字符等等。
修饰符,是拓展正则表达式的作用,如不区分大小写等。
PHP 正则表达式定位符
定位符有“^”和“$”。当然,你也可以使用空格作为定位符(不推荐使用,就不说了)。
"^a": 匹配以 "a"为开头的字符串;
"e$": 匹配以 "e" 结尾的字符串;
"^a[a-z]*e$": 匹配以a开头和以e结尾的字符串,[a-z]代表26个字母中任意一个,“*”代表个数可以是0个或多个。
在大括号里面限制字符出现的个数,如“ab{2}”可以 匹配一个a后面跟两个b,且一个也不能少。
ab{2,}: a字母后最少更两个b,即“abb”, “abbbb”等
ab{3,5}: 字母a后3-5个b,如“abbb”、“abbbb”、“abbbbb”
注意:如果不是单字符匹配需要使用小括号,即a(bc){2,}:字母a后匹配2个或两个以上的bc。如“abcbc”,“abcbcbc”等。
加号:"+"字符用来匹配元字符前的字符出现一次或者多次。例如"/ac+/"表示被匹配的对象可以是"act"、"account"、"acccc"等在"a"后面出现一个或者多个"c"的字符串。"+"相当于"{1,}"。
星号:"*"字符用来匹配元字符前的字符出现零次或者多次。例如"/ac*/"表示被匹配的对象可以是"app"、"acp"、"accp"等在"a"后面出现零个或者多个"c"的字符串。"*"相当于"{0,}"。
问号:"?"字符用来匹配元字符前的字符出现零次或者1次。例如"/ac?/"表示匹配的对象可以是"a"、"acp"、"acwp"这样在"a"后面出现零个或者1个"c"的字符串。"?"在正则表达式中还有一个非常重要的作用,即"贪婪模式"。
PHP 正则表达式中括号 []
[ ]。他们可以匹配"[]"之中出现过的字符,比如"/[az]/"可以匹配单个字符"a"或者"z";如果把上面的表达式改成这样"/[a-z]/",就可以匹配任何单个小写字母,比如"a"、"b"等等。
如果在"[]"中出现了"^",代表本表达式不匹配"[]"内出现的字符,比如"/[^a-z]/"不匹配任何小写字母!并且正则表达式给出了几种"[]"的默认值:
PHP正则表达式小括号 ()
正则表达式除了可以用户匹配,还可以用括号"()"来记录需要的信息,储存起来,给后面的表达式读取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为之类的),在后面如果想要读取记录下来的字符串,只是需要用"转义符+记录的次序"来读取。比如"/1"就相当于第一个"[a-zA-Z0-9_-]+","/2"相当于第二个([a-zA-Z0-9_-]+),"/3"就是第三个(.[a-zA-Z0-9_-])。但是在PHP中,"/"是一个特殊的字符,需要转义,所以""到了PHP的表达式中就应该写成"//1"。
正则公式里使用字符“│”进行或运算。如:(a│b)*c"匹配含有这样包括零个或多个a或b,后面跟一个c。
点“.”可以代表所有的单一字符,如"a.[0-9]": 一个a跟一个字符再跟一个数字的。“^.{3}$”是以三个字符结尾。
正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要。正则表达式里面的修饰符如下:
i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。
s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置"贪婪模式"。
注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E"
PHP 正则表达式常用函数
在PHP中的正则表达式有两套,多数时候使用的是由PCRE(Perl Compatible Regular Expression)库提供的。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。
1、preg_match
函数格式:int preg_match(string pattern, string subject, array [matches]);
这个函数会在string中使用pattern表达式来匹配,如果给定了[regs],就会将string记录到[regs][0]中,[regs][1]代表使用括号"()"记录下来的第一个字符串,[regs][2]代表记录下来的第二个字符串,以此类推。preg如果在string中找到了匹配的pattern,就会返回"true",否则返回"false"。
2、preg_replace
函数格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符,则可以使用"()"来记录,在replacement中只是需要用"/1"来读取。
3、preg_split
函数格式:array preg_split(string pattern, string subject, int [limit]);
这个函数和函数split一样,区别仅在与split可以使用简单正则表达式来分割匹配的字符串,而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。
4、preg_grep
函数格式:array preg_grep(string patern , array input)
这个函数和preg_match功能基本上,不过preg_grep可以将给定的数组input中的所有元素匹配,返回一个新的数组。查看: 169|回复: 8
求帮忙,正则匹配后结果不能全部输出来,只能显示一个
阅读权限140
在线时间 小时
签到天数:4 天结帖率: (4/4)
本人半桶水,正则匹配也是才开始摸索
今天想写一个网页提取代理ip地址列表的软件,主要还是为了学习.
边摸索边写的正则,我想把所有的匹配结果输出到编辑框里面,调试输出的时候显示已经匹配到了100个,但是输出到编辑框时就只有一个.(看图)
不知道我的语法哪里有问题?求大神指教,非常感谢!
(144.85 KB, 下载次数: 5)
12:56 上传
点击文件名下载附件
&&窗口程序集名保 留&&保 留备 注窗口程序集_启动窗口&&&_按钮1_被单击&&局_正则正则表达式&&局_搜索结果搜索结果√0局_计次整数型&&局_匹配数整数型&匹配数量源文本文本型&欲被匹配的文本源文本 = 到文本 (网页_访问 (“/mo.php?sxb=&tqsl=” + 编辑框2.内容 + “&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=”))调试输出 (源文本)局_正则.创建 (“\d+\.\d+\.\d+\.\d+\:\d*”, 假)局_正则.多行模式 = 假局_搜索结果 = 局_正则.搜索全部 (源文本)局_匹配数 = 取数组成员数 (局_搜索结果)计次循环首 (局_匹配数, 局_计次)输出调试文本 (“匹配文本 ” + 到文本 (局_计次) + “ 中的子匹配文本 1:” + 局_搜索结果 [局_计次].取子匹配文本 (源文本, 1, ))计次循环尾 ()调试输出 (局_匹配数)编辑框1.内容 = 局_搜索结果 [1].取匹配文本 (源文本, )信息框 (“成功提取IP:” + 到文本 (局_匹配数) + “个”, 0, , )RegEx正则表达式支持库
spec特殊功能支持库
.版本 2
.支持库 RegEx
.支持库 spec
.程序集 窗口程序集_启动窗口
.子程序 _按钮1_被单击
.局部变量 局_正则, 正则表达式
.局部变量 局_搜索结果, 搜索结果, 静态, &0&
.局部变量 局_计次, 整数型
.局部变量 局_匹配数, 整数型, , , 匹配数量
.局部变量 源文本, 文本型, , , 欲被匹配的文本
源文本 = 到文本 (网页_访问 (“/mo.php?sxb=&tqsl=” + 编辑框2.内容 + “&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=”))
调试输出 (源文本)
局_正则.创建 (“\d+\.\d+\.\d+\.\d+\:\d*”, 假)
局_正则.多行模式 = 假
局_搜索结果 = 局_正则.搜索全部 (源文本)
局_匹配数 = 取数组成员数 (局_搜索结果)
.计次循环首 (局_匹配数, 局_计次)
& & 输出调试文本 (“匹配文本 ” + 到文本 (局_计次) + “ 中的子匹配文本 1:” + 局_搜索结果 [局_计次].取子匹配文本 (源文本, 1, ))
.计次循环尾 ()
调试输出 (局_匹配数)
编辑框1.内容 = 局_搜索结果 [1].取匹配文本 (源文本, )
信息框 (“成功提取IP:” + 到文本 (局_匹配数) + “个”, 0, , )
补充内容 ( 13:08):
源码查看 在你的基础上修改的
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (4/4)
QQ截图17.jpg (226.14 KB, 下载次数: 0)
13:03 上传
您可以选择打赏方式支持楼主
阅读权限70
在线时间 小时
结帖率: (21/24)
最好把源码发出来 方便改
(163.02 KB, 下载次数: 2)
13:14 上传
点击文件名下载附件
源码查看 在你的基础上修改的
热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
感谢分享,很给力!~
您可以选择打赏方式支持楼主
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (4/4)
您可以选择打赏方式支持楼主
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (4/4)
没有人会么
您可以选择打赏方式支持楼主
阅读权限70
在线时间 小时
签到天数: 1 天结帖率: (19/21)
最好把源码发出来 方便改
您可以选择打赏方式支持楼主
阅读权限70
在线时间 小时
结帖率: (21/24)
用编辑框的加入文本
您可以选择打赏方式支持楼主
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (4/4)
最好把源码发出来 方便改
发了& && & 啊
您可以选择打赏方式支持楼主
阅读权限140
在线时间 小时
签到天数: 3 天结帖率: (13/13)
输出调试文本 (“匹配文本 ” + 到文本 (局_计次) + “ 中的子匹配文本 1:” + 局_搜索结果 [局_计次].取子匹配文本 (源文本, 0, ))&&
补充内容 ( 13:18):
易语言 索引是从0开始的
感谢你的支持,精易有你更精彩
您可以选择打赏方式支持楼主
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
Powered by

我要回帖

更多关于 正则表达式匹配中文 的文章

 

随机推荐