【2014年8月14日】关于正则表达式的一些事情

2014-08-15(五) by chenjia.me

日记部分

虽然已经从学线退休了,下午接到许老师的电话,还是很快的又进入工作模式了。成为习惯或者是一种心态么。

PHP中的正则表达式的使用

爬虫

说起爬虫,很多人都不陌生。爬虫的核心就是在于自动化的数据检索和获取。从一种规范的网页中获取一定的内容。比如我们可以通过抓取<title>.*</title>来获得目标网页的标题。

PHP的好处就是可以放在服务器上,通过配置pron等任务计划,可以定时的帮我们做一些事情,例如抓取网页最新的新闻标题到我们的数据库中这样的任务。

当然jsp,asp,python等都可以~

正则表达式的使用

当我们通过PHP获取目标网址的网页文本的时候,我们就要开始尝试的去寻找规律。

对于新手,建议将网页源代码复制到notepad++或者sublime等支持正则表达式的文本编辑器,或者RegEx Tester这样的正则表达式测试工具来学习。

将文本复制到这里面去,然后打开查找,输入正则表达式进行匹配,点击查找来看看有没有写对。

正则表达式的语法:

http://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx

http://baike.baidu.com/view/94238.htm?fr=aladdin

这两个足够了,基本用法只要知道他是怎么用的就好,关键是你要有想法如何去提取目标素材。

PHP中的使用

定界符

Perl 兼容模式的正则表达式函数,其正则表达式需要写在定界符中。任何不是字母、数字或反斜线()的字符都可以作为定界符,通常我们使用 / 作为定界符。具体使用见下面的例子。

这个是细节,在写网页中的正则表达式会出现这样的错误

Unknown modifier '['

这个就是定界符冲突,因为默认PHP使用的是/,例如</span>这样的标签的/s就会被当做的分界出现错误 Unknown modifier 's'

所以我的习惯是这样的

preg_match_all("|正则表达式|U",$this-&gt;webPageString,$tmpResult);

用|来分离

语法 第一种是获取第一个,也就是一次。

preg_match()

preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。

语法: int preg_match( string pattern, string subject [, array matches ] )

参数说明:

参数 说明

pattern 正则表达式

subject 需要匹配检索的对象

matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推

&lt;?php
if(preg_match("/php/i", "PHP is the web scripting language of choice.", $matches)){
print "A match was found:". $matches[0];
} else {
print "A match was not found.";
}
?&gt;

//output
A match was found: PHP

第二种是查找全部,然后把匹配的都放到一个数组中。

preg_match_all()

preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。

语法: int preg_match_all( string pattern, string subject, array matches [, int flags ] )

参数说明:

参数 说明

pattern 正则表达式

subject 需要匹配检索的对象

matches 存储匹配结果的数组

flags 可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有: PREG_PATTERN_ORDER:默认,对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推 PREG_SET_ORDER:对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推 PREG_OFFSET_CAPTURE:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量

&lt;?php
$str = "&lt;pre&gt;学习php是一件快乐的事。&lt;/pre&gt;&lt;pre&gt;所有的phper需要共同努力!&lt;/pre&gt;";
$kw = "php";
preg_match_all('/&lt;pre&gt;([sS]*?)&lt;/pre&gt;/',$str,$mat);
for($i=0;$i&lt;count($mat[0]);$i++){
$mat[0][$i] = $mat[1][$i];
$mat[0][$i] = str_replace($kw, '&lt;span style="color:#ff0000"&gt;'.$kw.'&lt;/span&gt;', $mat[0][$i]);
$str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?&gt;

//output
文本中所有 &lt;pre&gt;&lt;/pre&gt; 标签内的关键字(php)显示为红色。

以上引用http://www.jb51.net/article/39252.htm

小提示

  1. 获取到数据的存储变量(存储匹配结果的数组)最好用$value[0]这样的形式获取
  2. 注意转义符号,像' " \ 这样在正则表达式出现的符号都要用\' \" \这样的转义符号代替
  3. 多注意PHP输出的错误,百度之。

Comments