php正则表达式(一)


  1 <?php
  2 header("Content-type:text/html;charset=utf-8");
  3 /****
  4  * ======================================================================================= 
  5  *
  6  * 正则表达式组成:【1、定界符号  2、原子  3、元字符   4、模式修饰符】
  7  *
  8  * ======================================================================================= 
  9  * 1. 正则表达式就是描述字符串排列模式的一种自定义语法规则。
 10  * 2. 如果可以使用字符串处理函数完成的任务,就不要使用正则
 11  * 3. 有一些复杂的操作,只能使用正则完成。
 12  * 
 13  * 正则表达式可以在很多计算机语言中应用
 14  *
 15  *  4. 正则表达式也称为一种模式表达式。
 16  *  5.正则表达式就是通过构建具有特定规则的模式,与输入的字符信息比较。再进行分割、匹配、查找、替换等工作
 17  *   
 18  *    "/\<img\s*src=\".*?\"\/\>/"
 19  *    
 20  *    一、正则表达式也是一个字符串
 21  *    二、由具有特殊意义的字符组成的字符串
 22  *    三、具有一点编写规则,也是一种模式
 23  *    四、看作是一种编程语言(是用一些特殊字符,按规则编写出一个字符串,形成一种模式---正则表达式)
 24  *
 25  *
 26  *    注意: 如果正则表达式,不和函数一起使用,则它就是一个字符串,如果将正则表达式放到到某个函数中使用, 才能发挥出正则表达式的作用。
 27  *
 28  *     用到分割函数中,就可以用这个正则去分割字符串
 29  *     用到替换函数中,就可以用这个正则去替换字符串
 30  *     ...
 31  *
 32  *    在PHP中给我们提供两套正则表达式函数库
 33     POSIX 扩展正则表达式函数(ereg_)
 34     Perl 兼容正则表达式函数(preg_)
 35 
 36     这个函数功能一样, 找一个处理字符串效率高的
 37 
 38     注意:推荐使用Perl 兼容正则表达式函数库(只学这一种)
 39 
 40 
 41 
 42     学习正则表达式时,有两方面需要学习:
 43 
 44     一、正则表达式的模式如何编写
 45     语法:
 46         1. 定界符号  // 
 47             除了字母、数字和正斜线\ 以外的任何字符都可以为定界符号
 48             | |
 49             / /
 50             { }
 51             ! !
 52             
 53             没有特殊需要,我们都使用正斜线作为正则表达式的定界符号
 54 
 55 
 56         2. 原子   img \s . 
 57             注意:原子是正则表达式的最基本组成单位,而且必须至少要包含一个原子
 58             只要一个正则表达式可以单独使用的字符,就是原子
 59 
 60             1. 所有打印(所有可以在屏幕上输出的字符串)和非打印字符(看不到的)
 61             2. \. \* \+ \? \( \<\> 如果所有有意义的字符,想作为原子使用,统统使用 ”\“转义字符转义 m
 62                 " \ "转义字符可以将有意的字符转成没意义的字符,还可以将没意义的字符转为有意义的字符
 63             3. 在正则表达式中可以直接使用一些代表范围的原子
 64                 \d  : 表示任意一个十进制的数字       [0-9]
 65                 \D  : 表示任意一个除数字这外的字符   [^0-9]
 66                 \s  : 表示任意一个空白字符,空格、\n\r\t\f   [\n\r\t\f ]
 67                 \S  : 表示任意一个非空白                     [^\n\r\t\f ]
 68                 \w  : 表示任意一个字 a-zA-Z0-9_              [a-zA-Z_]
 69                 \W  : 表示任意一个非字, 除了a-zA-Z0-9_以外的任意一个字符  [^a-zA-Z0-9_]
 70             4. 自己定义一个原子表[], 可以匹配方括号中的任何一个原子
 71                 [a-z5-8]
 72                 [^a-z] 表示取反, 就是除了原子表中的原子,都可以表示(^必须在[]内的第一个字符处出现)
 73 
 74             .    
 75 
 76 
 77         3. 元字符  * ? 
 78             元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现
 79             *  : 表示其前的原子可以出现 0次、1次、或多次                       {0,}
 80             +  : 表示其前的原子可以出现1次 或多次, 不能没有最少要有一个       {1,}
 81             ?  : 表示其前面的原子可以出现0次或1次, 有只能有一次,要么没有    {0,1}
 82             {} : 用于自己定义前面原子出现的次数
 83                 {m}   //m表示一个整数, {5}表示前面的原子出现5次
 84                 {m,n}  //m和n表示一个整数,{2,5} m要小于n, 表示前面出现的原子,最少m次,最多n次,包括m和n次
 85                 {m,}   //表示前面的原子最少出现m次,最多无限    
 86                 
 87             .   : 默认情况下,表示除换行符外任意一个字符
 88             ^   : 直接在一个正则表达式的第一个字符出现,则表达必须以这个正则表达式开始
 89             $   : 直接在一个正则表达式的最后一个字符出现,则表达必须以这个正则表达式结束
 90             |   : 表示或的关系 , 它的优先级号是最低的, 最后考虑它的功能
 91 
 92             \b  : 表示一个边界
 93             \B  : 表示一个非边界
 94 
 95             ()  : 重点
 96 
 97             一、 () 作用: 是作为大原子使用
 98             二、 改变优先级,加上括号可以提高优先级别
 99             三、 作为子模式使用, 正则表达式不先对一个字符串匹配一次, 全部匹配作为一个大模式,放到数组的第一个元素中,每个()是一个子模式按顺序放到数组的其它元素中去。
100             四、可以取消子模式,就将()作为大原子或改变优先级使用, 在括号中最前面使用"?:"就可以取消这个()表示的子模式
101             五、反向引用, 可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分, 如果是在正则表达式像替换函数preg_replace函数中, 可以将子模式取出, 在被替换的字符串中使用
102 
103             \1 取第一个子模式、 \2取第二个子模式, ....  \5 (注意是单引号还是双引号引起来的正则)
104 
105             "\\1"
106             '\1'
107             
108             ${1} ${2}
109 
110             \* \+ \. \?
111 
112             \ 
113             () (?:) []
114             * + ? {}
115             ^  $   \b
116             |
117 
118         4. 模式修正符号     i u
119             "/ /模式修正符"
120             1. 就是几个字母
121             2. 可以一次使用一个,每一个具一定的意义, 也可以连续使用多个
122             3. 是对整个正则表达式调优使用, 也可以说是对正则表达式功能的扩展
123 
124             "/abc/" 只能匹配小写字母 abc
125             "/abc/i" 可以不区分大小写匹配 ABC abc Abc ABc AbC
126 
127         i : 表示在和模式进行匹配进不区分大小写
128         m : 默认情况,将字符串视为一行  ^  $ 视为多行后,任何一行都可以以正则开始或结束
129         s : 如果没有使用这个模式修正符号时, 元字符中的"."默认不能表示换行符号,将字符串视为单行
130         x : 表示模式中的空白忽略不计
131         e : 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说)
132         A :
133         Z :
134         U : 正则表达式的特点:就是比较”贪婪“  .* .+ 所有字符都符合这个条件
135 
136             一种使用模式修正符号 U 
137             加一种是使用?完成  .*?  .+?
138 
139             如果两种方式同时出现又开启了 贪婪模式  .*? /U
140         
141         "/\<img\s*src=\".*?\"\/\>/iU"
142         "#\<img\s*src=\".*?\"\/\>#iU"
143 
144         /原子和元字符/模式修正符号   / 为定界符号 (有一些语言是不需要这个定界符号)
145 
146         有点语言中不支持模式修正符号 javascript
147 
148         
149         用户名不能为空 /^\S+$/
150         email 
151         url 
152         电话
153 
154         将一个网站中的所有图片取出 
155         将一个网站的所有商品取出, 
156 
157 
158     二、学习正则表达式的强大处理函数
159         preg_match();
160             
161             
162             
163             
164             
165 *****/
166 
167 
168 
169 //$pattern="/(af){1,5}bcde/";//正则表达式模式【\斜杠转义】
170 $pattern="/a|bcde/";//正则表达式模式【\斜杠转义】
171 $string="cfafafafafbcde";//需要和上面模式字符串进行匹配的变量字符串  
172 //preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。  
173 if(preg_match($pattern,$string)){
174     echo "【{$pattern}】匹配;{$string}: 匹配成功!";
175 }else{
176     
177     echo "匹配失败!";
178 } 
179 
180 echo "<br/><br/><br/>";
181 
182 
183  //匹配日期
184  $string="today is 2016-5-10 15:28:41 pm ...";//需要和上面模式字符串进行匹配的变量字符串  
185 
186  //匹配年月日时分秒
187 $pattern1="/\d{4}\W\d\W\d{2}\s+\d{2}\W\d{2}\W\d{2}\s+pm/";//正则表达式模式【\斜杠转义】
188 
189 //用()作为子模式获取年、月、日、时、分、秒
190 $pattern2="/((\d{4})\W\d\W\d{2})\s+(\d{2}\W\d{2}\W\d{2})\s+(am|pm)/";//正则表达式模式【\斜杠转义】
191 
192 //可以取消子模式,就将()作为大原子或改变优先级使用, 在括号中最前面使用"?:"就可以取消这个()表示的子模式
193 $pattern3="/((?:\d{4})\W\d\W\d{2})\s+(?:\d{2}\W\d{2}\W\d{2})\s+(am|pm)/";//正则表达式模式【\斜杠转义】
194 
195 //反向引用, 可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分, 如果是在正则表达式像替换函数preg_replace函数中, 可以将子模式取出, 在被替换的字符串中使用
196 //\1 取第一个子模式、 \2取第二个子模式, ....  
197 //"\\1" 
198 //'\1' (注意是单引号还是双引号引起来的正则)
199 $pattern4="/\d{4}(\W)\d\\1\d{2}\s+\d{2}(\W)\d{2}\\2\d{2}\s+pm/";//正则表达式模式【\斜杠转义】
200 
201 
202 echo "匹配日期:$string";
203 //1---------------
204 preg_match($pattern1,$string,$arr);
205 show_dump($arr);
206 
207 //2---------------
208 preg_match($pattern2,$string,$arr);
209 show_dump($arr); 
210 
211 //3---------------
212 preg_match($pattern3,$string,$arr);
213 show_dump($arr);
214 
215 
216 //4---------------
217 preg_match($pattern4,$string,$arr);
218 show_dump($arr);
219 
220 
221 echo "<br/><br/><br/>";
222 
223 
224 //匹配邮箱
225 
226 //表达式【一】
227 //$pattern="/^\w+@\w+\.com|net$/";
228 //表达式【二】
229 $pattern = "/(\w*)@(\w*).com/";
230 //表达式【三】
231 $pattern = "/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/";
232 //邮箱
233 $str="info@cc1101.com";
234 preg_match($pattern,$str,$arr);
235 show_dump($arr); 
236 echo "<br/><br/><br/>";
237 
238 //匹配手机号码
239 //表达式【一】
240 $preg="/^1[34578]{1}\d{9}$/"; 
241 //表达式【二】
242 //$preg="/^((\d{2,3})|(\d{3}\-))?13\d{9}$/"; 
243 //表达式【三】
244 //$preg="/^(1(([35][0-9])|(47)|[8][0126789]))\d{8}$/";  
245 //手机号
246 $mobile="13424342798";  
247 //匹配
248 preg_match($preg,$mobile,$arr);
249 show_dump($arr);
250 echo "<br/><br/><br/>";
251  
252  
253  
254 //匹配用户名【字母开头,允许5-16字节,允许字母数字下划线】
255 $preg="/^[a-zA-Z-]\w{4,16}$/"; 
256 $name="qulinke1230"; 
257 //匹配
258 preg_match($preg,$name,$arr);
259 show_dump($arr);
260 echo "<br/><br/><br/>";
261  
262 
263 
264 
265  
266 //匹配密码【6到16位的字符串】【/^\w{6,16}$/i中i代表不区分大小写】
267 //只允许包含数字、字母、下划线组成的6到16位字符
268 $preg="/^\w{6,16}$/"; 
269 $pwd="adfsADSFSDF"; 
270 //匹配
271 preg_match($preg,$pwd,$arr);
272 show_dump($arr);
273 echo "<br/><br/><br/>";
274  
275 
276 //匹配密码【密码数字字母特殊符号6-16位】
277 $preg="/^[0-9a-zA-Z#@!~%^&*_-|]{6,16}$/"; 
278 $pwd2="AAA@AAA_"; 
279 //匹配
280 preg_match($preg,$pwd2,$arr);
281 show_dump($arr);
282 echo "<br/><br/><br/>";
283  
284 
285 
286 /***
287 
288 $url="http://static1.tuicool.com/images/ad/jpush120.jpg";  
289 header("Content-type:image/jpg;");
290 $img=file_get_contents($url);
291 $file='./2.jpg'; 
292 if(!is_file($file)){ 
293 file_put_contents($file,$img);
294 } 
295 //unlink($file);
296 
297 ****/
298  
299 
300  
301  //匹配图片
302  $src="<img src='http://n.sinaimg.cn/blog/20160509/Itbo-fxryhhh1789559.jpg'/>"; 
303  //$src="sdfsdf.da$^sdf"; 
304  //$preg="/\</";
305  $preg="/<img\s+?src=[\\\'| \\\"](.*?(?:[\.gif|\.jpg]))[\\\'|\\\"].*?[\/]?>/";
306  preg_match($preg,$src,$arr);
307  show_dump($arr);
308 echo "<br/><br/><br/>";
309 
310 
311 
312 //url匹配
313 $url="http://www.baidu.com";
314 $preg="/[http:\/\/]*w{3}\.\w+(\.com|\.cn|\.com\.cn|\.net|\.cc)/";
315  preg_match($preg,$url,$arr);
316  show_dump($arr);
317 echo "<br/><br/><br/>";
318 
319 
320 $html="http://www.jb51.net/article/54526.htm";
321 header("Content-type:text/html;charset=gb2312");
322 $info=file_get_contents($html);
323 //echo $info; 
324 
325 //匹配html里面的div
326 $html1="<header><div class='title'>123123</div></header>";
327 //$html1="1111<div class='title'>123</div>";
328 $preg="/<div\s+class=[\\\'|\\\"]box\s+mb15\s+.*[\\\'|\\\"]>.*?<\/div>/";
329 preg_match($preg,$info,$arry);
330 $str=$arry[0]; 
331 //echo $str;
332 //strip_tags() 函数,可以剥去 HTML、XML 以及 PHP 的标签。
333 echo strip_tags($str); 
334 echo "<br/><br/><br/>";
335 
336 
337 
338 $preg="/(?:http\:\/\/)?w{3}\.\w+\.(com|cn|net)/";
339 $url="http://www.baidu.com";
340 /***
341 $arr=explode('.',$url);
342 echo $arr[count($arr)-1];
343 show_dump($arr); 
344 ****/
345 
346 preg_match($preg,$url,$arr);
347 show_dump($arr); 
348 
349 //echo substr($url,-3,strlen($url));
350 
351 echo "<br/><br/><br/>";
352 
353 
354 
355 
356 
357 //==============模式修饰符 【i 、 m 、 s、 x、 e、 】============================
358 
359 //1、i (PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。 
360 $preg="/^abc.*$/i";
361 $string="AbCDdefj";
362 //开始匹配【不区分大小写】
363 preg_match($preg,$string,$arr);
364 show_dump($arr);
365 echo "<br/><br/><br/>";
366 
367 
368 
369 //2、m 默认情况,将字符串视为一行  ^  $ 视为多行后,任何一行都可以以正则开始或结束
370 $preg="/^bac.*/m";
371 $string="AbCD
372 asdadefj
373 baceqw
374 defj";
375 //开始匹配【将字符串视为一行 】
376 preg_match($preg,$string,$arr);
377 show_dump($arr);
378 echo "<br/><br/><br/>";
379 
380 
381 
382 
383 //3、s 如果没有使用这个模式修正符号时, 元字符中的"."默认不能表示换行符号,将字符串视为单行
384 $preg="/bac.*/is";
385 $string="AbCD
386 asdadefj
387 baceqw
388 defj
389 testes
390 ";
391 //开始匹配【不区分大小写】
392 preg_match($preg,$string,$arr);
393 show_dump($arr);
394 echo "<br/><br/><br/>";
395 
396 
397 
398 
399 
400 
401 
402 
403 //4、x 表示模式中的空白忽略不计
404 $preg="/ab  c.*/ix";
405 $string="CDaaaabccsdadefj";
406 //开始匹配【不区分大小写】
407 preg_match($preg,$string,$arr);
408 show_dump($arr);
409 echo "<br/><br/><br/>";
410 
411 
412 
413 
414 //5、U : 正则表达式的特点:就是比较”贪婪“  .* .+ 所有字符都符合这个条件
415 //1、解决贪婪模式【使用模式修饰符U来处理】
416 $preg="/\<b\>(.*)\<\/b\>/iU";
417 $string="<b>aaaaaaaa</b>  <b>bbbbbbbbbb</b>  <b>ccccccccc</b> <b>dddddddd</b>";
418 //开始匹配【不区分大小写】
419 preg_match($preg,$string,$arr);
420 show_dump($arr);
421 echo "<br/><br/><br/>";
422 
423 
424 //2、解决贪婪模式【使用?号来处理】
425 $preg="/\<b\>(.*?)\<\/b\>/i";
426 $string="<b>aaaaaaaa</b>  <b>bbbbbbbbbb</b>  <b>ccccccccc</b> <b>dddddddd</b>";
427 //开始匹配【不区分大小写】
428 preg_match($preg,$string,$arr);
429 show_dump($arr);
430 echo "<br/><br/><br/>";
431 
432 
433 
434 
435 
436 
437 
438 
439 
440 $img="<img src='http://www.111cn.net /1.mp3' type='application/x-mplayer2'/>";
441 $preg="/src='(.*?)'/";
442 
443 preg_match($preg,$img,$arr);
444 show_dump($arr);
445 echo "<br/><br/><br/>";
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 
458 
459 //格式化输出
460 function show_dump($array){
461     echo "<pre>";
462     print_r($array);
463     echo "</pre>";
464 };
465 
466  
467 ?>

 


posted @ 2016-05-09 08:31  飞越全球  阅读(275)  评论(0编辑  收藏  举报