preg使用。还是一样,只是个人记录,不放博客园首页

管理员要是看到该文章放到博客园首页了,还请麻烦给移除。

因为这只是个人的笔记,没有细入去研究

  1 <?php
  2  header("content-Type:text/html; charset=utf-8");
  3  echo '<pre>';
  4  /**
  5   *    PHP正则的学习笔记
  6  */
  7  ?>
  8     元字符
  9         代码    说明
 10         .        匹配除换行符以外的任意字符
 11         \d        匹配数字 [表示数字 0-9]
 12         \D        匹配除数字意外的任意字符 [\d的反义]
 13         \w        匹配字母或数字或下划线或汉字 [表示数字、字母、下划线、汉字 0-9 a-z A-Z]
 14         \s        匹配任意的空白符 [表示任意的空白符:空格 ,制表符\t,换行符\n,回车\r,分页\f,垂直制表\v,中文全角空格等]
 15         \S        匹配所有的非空白字符 [\s的反义]
 16         \b        匹配单词的开始或结束 [匹配单个单词]
 17         ^        匹配字符串的开始 [用来匹配要查找字符串的开头 所有的字符都用于比较]
 18         $        匹配字符串的结束 [和\b、^ 类似,区别在于 $ 为结尾处 所有的字符都用于比较]
 19     正则 模式修正符
 20         特点:多个模式修正符可以放在一块使用
 21         m    整个字符串按多行来进行匹配。可以理解为将字符串里符合的内容全部匹配出来
 22         i    不区分大小写模式的匹配
 23         x    忽略掉匹配表达式里[正则表达式]的空格
 24         U    匹配最近的字符串,禁止贪婪匹配
 25         A    强制从^字符串开始算起,必须配合^使用
 26         D    只匹配到$符号的位置处 设置了m就没用了
 27         e    把替换字符串当成一个表达式使用。类似eval()函数
 28     
 29     限定字符
 30         代码    说明
 31         *        重复零次或多次 [任意次数]
 32         +        重复一次或多次 [至少会出现一次]
 33         ?        重复零次或一次 [可能会出现一次]
 34         {n}        重复 n 次
 35         {n, }    重复 n 次或者更多次 [重复n次以上:包括n次] {TIP:貌似达不到预期}
 36         {n,m}    重复 n 到 m 次
 37     
 38     分歧条件
 39         |        或 [从左往右检测。如果左边的规则符合,右边的规则将不会去匹配]
 40     
 41     分组
 42         
 43  
 44     后向引用:
 45          捕获:
 46              (exp)    匹配exp字符串,并自动分配组号
 47              (?<name>exp)    匹配exp字符串,并分配到组号为name的分组里
 48              (?:exp)    不匹配exp字符串,并且也不分配组号
 49          零宽断言(字符串分割匹配?):
 50              (?=exp)        匹配以exp结尾的字符,匹配结果不包括exp
 51              (?<=exp)    匹配一exp开头的字符,匹配结果同样不包括exp
 52          负向零宽断言(可以看做 '[^exp]' 的反义)
 53              (?!exp)        某字符串后边不是exp的
 54              (?<!exp)    某字符串前边不是exp的
 55          注释:(?#comment)    注释,给人看的
 56      
 57      贪婪与懒惰:
 58          贪婪可以理解为尽可能多的匹配重复的字符
 59          懒惰可以理解为尽可能少的匹配重复的字符(尽可能少?搞不明白)
 60              示例语法:
 61                  *?、+?、??、{n,m}?、{n,}?
 62                  
 63     EXP 64         \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 匹配简单IP
 65 <?php
 66 echo '<br><hr><br>';
 67 echo '<h3>原子表 []</h3>';
 68 echo '<p>原子表将[]里的内容依次匹配,不当做整体去匹配,只要一个符合即返回true</p>';
 69 echo '<p>如果原子表里有 ^ ,表示不是!即非</p>';
 70 echo '$str = \'cntnn11.com\';<br/>';
 71 echo '$preg = \'/n2/is\';<br/>';
 72 echo '$preg2 = \'/[n2]/is\';<br/>';
 73 echo 'preg_match($preg, $str) = 0<br/>';
 74 echo 'preg_match($preg2, $str) = 1<br/>';
 75 echo '<br><hr><br>';
 76 
 77 echo '<h3>正则 原子组 ()</h3>';
 78 echo '<p>把多个字符串分成一组,我们对多个字符串操作</p>';
 79 echo '<p>匹配出来的内容会放入一个内存,可以后期使用。在正则语句里使用\Num来表示原子组的编号 [如果正则在双引号里,需要对\进行转义]</p>';
 80 $str = "
 81     <html>
 82         <body>
 83             <h1>XX网php视频教程</h1>
 84             <h2>XX教程</h2>
 85             <h5>这是h5</h5>
 86             <p>www.baidu.com</p>
 87             <p>www.xxx.org</p>
 88             <p>map.google.com.cn</p>
 89         </body>
 90     </html>";
 91 $preg = "/<(h[\d])>(.*?)<\/(\\1)>/";    //
 92 preg_match_all($preg, $str, $arr, PREG_SET_ORDER);
 93 $preg_replace = "<\\1>\\2 -> 替换结果<\\3>";
 94 $str = preg_replace($preg, $preg_replace, $str);
 95 echo $str,'<br/>';
 96 echo '<p>如果在原子组里边加上 ?: 则表示不将该分组的内容进行缓存</p>';
 97 echo '<p>测试内容缓冲 ?: 获取网址,输出各网址的后缀名</p>';
 98 //$preg    = "/(www|map)\.\w+((\.)(com\.cn|com|org))/";    //获取所有匹配到的内容
 99 $preg    = "/(?:www|map)\.\w+((\.)(com\.cn|com|org))/";    //只匹配url后缀
100 $preg    = "/(?:www|map)\.\w+((?:\.)(?:com\.cn|com|org))/";    //只匹配url的.com.cn/.com/.org...
101 preg_match_all($preg, $str, $arr);
102 var_dump($arr[1]);
103 echo '<p>注释:(?#各种字符) 放在正则块的后边</p>';
104 
105 echo '<br><hr><br>';
106 echo '<h3>正则重复匹配</h3>';
107 echo '<p>exp:给php文件的注释里添加上\'@author cntnn11\'内容</p>';
108 $file    = file_get_contents('phppreg/134.php');
109 $preg    = "/(\/\*+)(.*)?(\*\/)/is";    //找出该文件中的注释部分。格式为:/** ... */
110 //preg_match_all($preg, $file, $arr, PREG_SET_ORDER);
111 //var_dump($arr);
112 $replace    = "\\1 \\2 *\t@author cntnn11 \r\n \\3";
113 $data    = preg_replace($preg, $replace, $file);
114 file_put_contents("phppreg/134demo.php", $data);
115 
116 echo '<br/><hr></br>';
117 echo '<h3>匹配一个email格式</h3>';
118 echo '<p>email exp:</p>';
119 $email    = "alkdls email@.qq.com **78ajkdsfh google@gamil.com oi4 msn@live.cn 45u43oi self.cntnn11@cntnnn11.com 45645 company@com.company";
120 $preg    = "/(\w+)@(\w+)\.(\w+)/is";
121 preg_match_all($preg, $email, $emailArr);
122 var_dump($emailArr);
123 
124 echo '<br/><hr></br>';
125 echo '<h3>匹配一个整数格式</h3>';
126 echo '<p>int Num exp:</p>';
127 $num    = '456 545 87d 54- -48 0 53.0 56';
128 $preg    = "/-?(\d+)/ism";
129 preg_match_all($preg, $num, $numArr);
130 var_dump($numArr);
131 
132 echo '<br/><hr></br>';
133 echo '<h3>匹配一个座机号码</h3>';
134 echo '<p>tel exp:</p>';
135 $tel    = '010-12345678 | (010)12345678 | 12345678 | 0731-1234567 | (0731)1234567 | 1234567';
136 $preg    = "/(\([0-9]{3,4}\)|([0-9]{3,4})?|\d{3,4}-)\d{7,8}/ism";
137 preg_match_all($preg, $tel, $telArr);
138 var_dump($telArr);
139 
140 echo '<br><hr><br>';
141 echo '<h3>正则搜索替换函数 preg_replace()</h3>';
142 echo '<p>preg_replace($pattern, $replacemenet, $subject, $limit, $count) [该函数与str_replace很相似,返回替换后的字符串]</p>';
143 echo '<p>$pattern:在$subject中被搜索的对象 [传入一个正则表达式,此处可以传入一个数组,包含多个表达式]</p>';
144 echo '<p>$replacemenet:用来替换匹配$pattern的内容 [传入一个正则表达式]</p>';
145 echo '<p>$subject:要操作的字符串</p>';
146 echo '<p>$limit:每个模式替换的次数 [默认-1,无限次替换]</p>';
147 echo '<p>$count:返回每替换一次就进行记录的变量 </p>';
148 echo '';
149 $str    = "我是一段字符串,字符串啊字符串!1234.。。。、5678!go go 够 足球go";
150 $pattern    = "/[\d*]/";
151 $replace    = "*";
152 echo preg_replace($pattern, '*', $str, 5),'<br />';
153 
154 echo '<h3>prge_replace_callback()</h3>';
155 echo '<p>在获取到匹配后的字符串后,再去调用一个回调函数进行处理<p>';
156 
157 
158 echo '<br><hr><br>';
159 echo '<h3>正则搜索替换函数 preg_filter()</h3>';
160 echo '<p>preg_filter($pattern, $replacemenet, $subject, $limit, $count)</p>';
161 echo '<p>如果$subject是一个数组,那么匹配到则返回数组,否则空数组array()</p>';
162 echo '<p>其他情况则返回字符串,没匹配到则返回NULL</p>';
163 echo '<p>他会将匹配的元素返回来。没有匹配的元素则不返回</p>';
164 echo '<p></p>';
165 echo '';
166 
167 $pattern = array('/\d/', '/[a-z]/', '/[1a]/');
168 $replace = array('t:$0', 'B:$0', 'C:$0');
169 $subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4');
170 
171 echo "preg_filter returns\n";
172 print_r(preg_filter($pattern, $replace, $subject));
173 /*Array
174 (
175       [0] => A:C:1
176       [1] => B:C:a
177       [2] => A:2
178       [3] => B:b
179       [4] => A:3
180       [7] => A:4
181 )*/
182 
183 
184 echo '<br><hr><br>';
185 echo '<h3>返回匹配模式的数组条目 preg_grep()</h3>';
186 echo '<p>preg_grep($pattern, $inArray)</p>';
187 echo '<p>返回$inArray中匹配$pattern的元素</p>';
188 echo '<p>他的匹配与数组键名无关,只会与元素的值去匹配</p>';
189 $inArray    = array(0=>'nicaia123', 1=>'nicai', 'a'=>345, 'd'=>'中文', 4=>'-');
190 $pattern    = '/\d/';
191 $inArray    = preg_grep($pattern, $inArray);
192 var_dump($inArray);
193 
194 
195 echo '<br><hr><br>';
196 echo '<h3>返回匹配模式的数组条目 preg_match()</h3>';
197 echo '<p>preg_match($pattern, $inArray[, $arr, $offset])</p>';
198 echo '<p>返回$inArray中匹配$pattern的元素</p>';
199 echo '<p>他的匹配与数组键名无关,只会与元素的值去匹配</p>';
200 echo '<p>第三个参数$arr可以当做一个返回值,如果设置了那么将返回一个数组</p>';
201 echo '<p>主要用于判断正则是否成功匹配字符串。类似于stripos()函数</p>';
202 $inArray    = array(0=>'nicaia123', 1=>'nicai', 'a'=>345, 'd'=>'中文', 4=>'-');
203 $pattern    = '/\d/';
204 $inArray    = preg_grep($pattern, $inArray);
205 var_dump($inArray);
206 
207 echo '<br><hr><br>';
208 echo '<h3>执行一个全局正则表达式匹配 preg_match_all()</h3>';
209 echo '<p>与preg_match()类似,区别在于该函数将返回所有匹配到的内容,而preg_match()只返回一次匹配到的内容</p>';
210 
211 
212 echo '<br><hr><br>';
213 echo '<h3>执行正则分隔字符串 preg_split()</h3>';
214 echo '<p>该函数将一段字符串按照正则规则进行分割,返回一个数组</p>';
215 echo '<p>该函数同explode(),str_split()类似。将一串字符串按照一定规则进行分隔成数组</p>';
216 $str    = "If you need to split a list of 'tags' while allowing for user error, you'll find this more useful than the manual's first example.";
217 $pattern    = '/n/';
218 $rs        = preg_split($pattern, $str);
219 var_dump($rs);
220 
221 
222 echo '<br><hr><br>';
223 echo '<h3>练习</h3>';
224 echo $subject    = "XX论坛bbs.xxg.comXX官网www.xxg.com245';统计第一个;号前的.com出现多少次";
225 preg_match_all('/(.com)(;)$/', $subject, $arr);
226 var_dump($arr);
227 
228  
229  
230  ?>
posted @ 2012-11-27 23:47  cntnn11  阅读(394)  评论(0编辑  收藏  举报