【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->webPageString,$tmpResult);
用|来分离
语法 第一种是获取第一个,也就是一次。
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
语法: int preg_match( string pattern, string subject [, array matches ] )
参数说明:
参数 说明
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
<?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.";
}
?>
//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:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量
<?php
$str = "<pre>学习php是一件快乐的事。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([sS]*?)</pre>/',$str,$mat);
for($i=0;$i<count($mat[0]);$i++){
$mat[0][$i] = $mat[1][$i];
$mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">'.$kw.'</span>', $mat[0][$i]);
$str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>
//output
文本中所有 <pre></pre> 标签内的关键字(php)显示为红色。
小提示
- 获取到数据的存储变量(存储匹配结果的数组)最好用$value[0]这样的形式获取
- 注意转义符号,像' " \ 这样在正则表达式出现的符号都要用\' \" \这样的转义符号代替
- 多注意PHP输出的错误,百度之。