PHP中使用正则表达式提取中文实现笔记

这篇文章主要介绍了PHP中使用正则表达式提取中文实现笔记,本文还讲解了韩文、日文的正则表达式,并同时给出实现代码和使用示例,需要的朋友可以参考下
 
 

最近老板叫做一个数据查重的小练习,涉及从一个包含中文字段的文件中提取出其中的中文字段并存储,使用php开发。中间涉及到php正则表达式中文匹配的问题,网上搜罗一大片,但是也很乱没有一个准信儿,经过自己的代码的修改和检验,先将extract函数写下。

首先要注意到的是,双字节字符的编码问题,这里我们以后还可能会遇到像韩文、日文等编码问题,与中文理解上是一个意思。

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 (日文)

 

在Notepad++下面,我们可以首先进行测试我们的正则书写的错误与否。第一个表达式我是使用[u4e00-u9fa5]+来检验的,+号表示不止一个

匹配符。结果与预期相同,那么,是否在脚本中就可以使用这个正则了呢?

我们测试一下,我们使用preg_match_all(‘/[u4e00-u9fa5]+/', $subject,$matches)调用,然后你却看到了这么一个结果:Compilation failed: PCRE does not support L, l, N{name}, U, or u at offset 2。。。。是不是很头大??这究竟是什么原因?

查阅了很多资料后发现,u (PCRE_UTF8),就是上面的PCRE,这是是一个Perl库,包括 perl 兼容的正规表达式库。此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。而php正则表达式对于十六进制数据的表达方式上也有所不同,在php中,是用x表示十六进制数据的。下面我们就将代码优化一下,检测函数变为:

 

代码如下:
class storeDataAdapter extends Store{
private $dsData;
/**
* 数据转换函数,调用preg_match_all根据$pattern正则来进行数值匹配,并将返回的结果以数组形式存储在$matches中,
* $matches[0]将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
* @see Store::data_convert()
*/
public function data_convert($pattern,$subject) {
$matches=array();
if (preg_match_all($pattern, $subject,$matches)){
return $matches[0];
}else
{
return null;
}
}
}

 

调用的时候变为:

 

代码如下:

$store=new storeDataAdapter($txtContent);
$match=array();
$dsName=$store->data_convert(‘/[x7f-xff]+/',$txtContent);
foreach ($dsName as $val){
echo $val."<br>";
}

 

输入文件为:

,下面是提取出中文之后的输出文件内容:

,符合预期需求。

时间: 2024-11-01 02:02:29

PHP中使用正则表达式提取中文实现笔记的相关文章

java中 利用正则表达式提取( )内内容_java

昨天遇到一个小问题,需要批量处理一些用户,而前台传来的用户格式如下,要提取括号中间的内容(不带括号) 教师10(0010)教师11(0011)教师9(009)教师12(0012)教师13(0013)教师14(0014) 本来想用java的String.split()和substring()来搞定,但是需要处理多次比较麻烦,就用正则表达式了.虽然语法忘得差不多了,但是印象中用断言比较方便(关键希望结果不带括号).打开RegexBuddy试了下,轻松搞定:下边是java实现代码: 复制代码 代码如下

php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符

 PHP使用正则表达式提取字符串中尖括号<>.小括号().中括号[].大括号{}中的字符示例,需要的朋友可以参考下    代码如下: $str="你好<我>(爱)[北京]{天安门}";    echo f1($str); //返回你好  echo f2($str); //返回我  echo f3($str); //返回爱  echo f4($str); //返回北京  echo f5($str); //返回天安门    function f1($str)  { 

基于Python正则表达式提取搜索结果中的站点地址

正则表达式对于Python来说并不是独有的,最近在把google搜索的结果中所有的站点地址导出,于是想到用python正则表达式提取搜索结果中的站点地址. 这其中涉及几个需要解决的问题: 1.获取搜索的结果文本 为了获得更多的地址,我使用了Google的高级搜索功能,每个页面显示100条结果. 获得显示的结果后,可以查看源码,并保持成文本文件就有了搜索的结果文本 2.分析如何提取站点信息 首先需要分析获取的页面,查看以怎样的方式可以提取出站点信息. 我使用IE8自带的开发工具(按F12就会弹出来

httpunit-java 正则表达式 抓取2行特定中文词语中的一段中文

问题描述 java 正则表达式 抓取2行特定中文词语中的一段中文 老师让我们做一个能从汉字网站http://hanyu.iciba.com上抓取汉字信息的爬虫,现在遇到了一个难题,下面是我用httpunit解析出来的某个字的部分信息. 龙 繁体 龍 笔画 5笔 造字法 原为形声 部首 龙部 五笔 DXV 结构 单一结构 比如说现在我要截取这个字的部首,也就是部首和五笔这2行字中间的那段字,那正则表达式是不是就是"部首.五笔",但是这样做了之后什么也没有截取出来,能告诉我怎么写这个表达式

html-怎样用正则表达式提取HTM中的部分数据

问题描述 怎样用正则表达式提取HTM中的部分数据 怎样用正则表达式从一个Html 中提取一些想要的数据,正则表达式该写在哪里呢 解决方案 /<(.*)>.*</1>/ "<(.*)>.*</1>" 匹配一个 HTML 标记. 解决方案二: 你是用什么语言,想提取什么标签内的内容 解决方案三: 问这种问题应该给出示例的html代码片断,以及你希望提取的数据,还有你用的编程语言,才好帮助到你. 你什么都不说,只能给你一个泛泛的解答了:在goo

基于Python正则表达式提取搜索结果中的站点地址_正则表达式

正则表达式对于Python来说并不是独有的,最近在把google搜索的结果中所有的站点地址导出,于是想到用python正则表达式提取搜索结果中的站点地址. 这其中涉及几个需要解决的问题: 1.获取搜索的结果文本 为了获得更多的地址,我使用了Google的高级搜索功能,每个页面显示100条结果. 获得显示的结果后,可以查看源码,并保持成文本文件就有了搜索的结果文本 2.分析如何提取站点信息 首先需要分析获取的页面,查看以怎样的方式可以提取出站点信息. 我使用IE8自带的开发工具(按F12就会弹出来

PHP正则表达式提取html超链接中的href地址

用php的正则表达式相关函数,实现提取html超链接<a href="地址"></a>中的地址.  代码如下 复制代码 <?php $preg='/<a .*?href="(.*?)".*?>/is'; $str ='<a href="链接1">URLNAME</a>文本段1<a href="链接2" target="_blank"&g

在MYSQL中使用正则表达式的笔记

正则表达式广泛用于各种程序编程的地方,在mysql sql语句中使用正则表达式也可以解决很多查询问题,化繁为简,并且巧妙运用可以提高mysql查询效率.本文讲讲mysql中如何使用regexp语法运行含有正则表达式的sql语句. SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name; 在mysql中sql语句使用正则表达式,在需要的地方用REGEXP关键字,如例中所示,REGEXP

比较全面的C 、Java、JavaScript中的正则表达式详解_正则表达式

什么是正则表达式? 正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗 * 浩":那么"罗 * 浩"就是公式,也称作 模式(Pattern) ,这篇文章就是 要匹配的串( 或叫文本 text) .再如,你要检查输入的一个字符串是否是 126 邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开