使用函数
PHP中, preg_match
和 preg_match_all
均支持正则表达式. 两者的主要区别是, preg_match_all
能获取所有的匹配项.
测试网站
oschina上有专用的测试工具 http://tool.oschina.net/regex/
对于正则表达式的调试, 可以使用该网站.
正则匹配遇到的问题
最近几天做爬虫抓取, 需要分析网页中的元素. 过程中遇到了几个涉及到中文匹配的错误. 数据大概是这个样子的.
<span class="cate_menu_line">/</span> <a target="_blank" class="cate_menu_lk" href="//channel.ooxx.com/furniture.html">家具</a>
<span class="cate_menu_line">/</span> <a target="_blank" class="cate_menu_lk" href="//channel.ooxx.com/decoration.html">家装</a>
<span class="cate_menu_line">/</span> <a target="_blank" class="cate_menu_lk" href="//channel.ooxx.com/kitchenware.html">厨具</a>
正则里面除了特殊符号转义, 主要就是中文了.
第一个版本: /<a target="_blank" class="cate_menu_lk" href="([a-z\.\/]+)">(\w+)<\/a>/
, 该版本尝试通过\w+
来匹配中文, 其实根本就没法匹配.
第二个版本: /<a target="_blank" class="cate_menu_lk" href="([a-z\.\/]+)">([\u4e00-\u9fa5]+)<\/a>/
[\u4e00-\u9fa5]+
可以匹配中文, 结果报错: Warning: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset
. \u9fa5
这种模式, 是perl正则的模式, 在php中需要被替换为: \x{9fa5}
第三个版本: /<a target="_blank" class="cate_menu_lk" href="([a-z\.\/]+)">([\x{4e00}-\x{9fa5}]+)<\/a>/
报错: Warning: preg_match() [function.preg-match]: Compilation failed: character value in \x{...} sequence is too large at offset
原因是正则结尾需要 u
最终版本: /<a target="_blank" class="cate_menu_lk" href="([a-z\.\/]+)">([\x{4e00}-\x{9fa5}]+)<\/a>/u