当前位置:我的异常网» PHP » 求问各种正则表达式后缀的意义解决方案
求问各种正则表达式后缀的意义解决方案(2)
www.myexceptions.net 网友分享于:2015-08-26 浏览:6次
"/ he/ ":空格开头,和^的作用一样,匹配以he开头的字符串;
"/he / ":空格结束,和$的作用一样,匹配以he结尾的字符串;
"/^he$/ ":表示只和字符串 "he "匹配。
括号:
正则表达式除了可以用户匹配,还可以用括号 "() "来记录需要的信息,储存起来,给后面的表达式读取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为username@server.com之类的),在后面如果想要读取记录下来的字符串,只是需要用 "转义符+记录的次序 "来读取。比如 "\1 "就相当于第一个 "[a-zA-Z0-9_-]+ ", "\2 "相当于第二个([a-zA-Z0-9_-]+), "\3 "就是第三个(.[a-zA-Z0-9_-])。但是在PHP中, "\ "是一个特殊的字符,需要转义,所以 " "到了PHP的表达式中就应该写成 "\\1 "。
其他特殊符号:
"| ":或符号 "| "和PHP里面的或一样,不过是一个 "| ",而不是PHP的两个 "|| "!意思就是可以是某个字符或者另一个字符串,比如 "/abcd|dcba/ "可能匹配 "abcd "或者 "dcba "。
------解决方案--------------------
5 贪婪模式:
前面在元字符中提到过 "? "还有一个重要的作用,即 "贪婪模式 ",什么是 "贪婪模式 "呢?
比如我们要匹配以字母 "a "开头字母 "b "结尾的字符串,但是需要匹配的字符串在 "a "后面含有很多个 "b ",比如 "a bbbbbbbbbbbbbbbbb ",那正则表达式是会匹配第一个 "b "还是最后一个 "b "呢?如果你使用了贪婪模式,那么会匹配到最后一个 "b ",反之只是匹配到第一个 "b "。
使用贪婪模式的表达式如下:
/a.+?b/
/a.+b/U
不使用贪婪模式的如下:
/a.+b/
上面使用了一个修饰符U,详见下面的部分。
6 修饰符:
在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着 "e "并不等于 "E ")。正则表达式里面的修饰符如下:
i :如果在修饰符中加上 "i ",则正则将会取消大小写敏感性,即 "a "和 "A " 是一样的。
m:默认的正则开始 "^ "和结束 "$ "只是对于正则字符串如果在修饰符中加上 "m ",那么开始和结束将会指字符串的每一行:每一行的开头就是 "^ ",结尾就是 "$ "。
s:如果在修饰符中加入 "s ",那么默认的 ". "代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说 "/a/A "匹配 "abcd "。
E:与 "m "相反,如果使用这个修饰符,那么 "$ "将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置 "贪婪模式 "。
7 PCRE相关的正则表达式函数:
PHP的Perl兼容正则表达式提供的多个函数,分为模式匹配,替换和匹配数目等等:
1、preg_match :
函数格式:int preg_match(string pattern, string subject, array [matches]);
这个函数会在string中使用pattern表达式来匹配,如果给定了[regs],就会将string记录到[regs][0]中,[regs][1]代表使用括号 "() "记录下来的第一个字符串,[regs][2]代表记录下来的第二个字符串,以此类推。preg如果在string中找到了匹配的pattern,就会返回 "true ",否则返回 "false "。
2、preg_replace :
函数格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符,则可以使用 "() "来记录,在replacement中只是需要用 "\1 "来读取。
3、preg_split :
函数格式:array preg_split(string pattern, string subject, int [limit]);
这个函数和函数split一样,区别仅在与split可以使用简单正则表达式来分割匹配的字符串,而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。
4、preg_grep :
函数格式:array preg_grep(string patern , array input);
这个函数和preg_match功能基本上,不过preg_grep可以将给定的数组input中的所有元素匹配,返回一个新的数组。
下面举一个例子,比如我们要检查Email地址的格式是否正确:
function emailIsRight($email) {
if (preg_match( "^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$ ",$email)) {
return 1;
}
return 0;
}
if(emailIsRight( 'y10k@963.net ')) echo '正确
';
if(!emailIsRight( 'y10k@fffff ')) echo '不正确
';
?>
上面的程序会输出 "正确
不正确 "。
8.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别:
虽然叫做“Perl兼容正则表达式”,但是和Perl的正则表达式相比,PHP的还是由一些不同,比如修饰符“G”在Perl里面代表全部匹配,但是在PHP中没有加入对这个修饰符的支持。
还有就是和ereg系列函数的区别,ereg也是PHP中提供的正则表达式函数,不过和preg相比,要弱上很多。
1、ereg里面是不需要也不能使用分隔符和修饰符的,所以ereg的功能比preg要弱上不少。
文章评论