【www.bbyears.com--正则表达式】
正则语法规则
我们先介绍三个东西,然后可以进行简单的例子了。
一、定界符 "/" 左斜线
php采用左斜线作为定界符,规定规则的边界,成对出现,两个定界符之间的内容就是需要被匹配的规则
二、元字符---出现模式类
匹配方式,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
比如出现一次,出现多于一次,出现多次,没有出现。等等。
常用的有:
+ 1次或多次
* 0次或1次或多次
? 0次或1次
{2,6} 2-6次
{2} 恰巧2次
{3,} 至少3次,>=3
三、元字符---特定字符类
代表一个特定的字符
\s 空白字符(单个空格符、tab键和换行符)
\S 非空白字符
\d 数字(单个 0到9)
\w 字母,数字或下划线字符
\W 非(字母,数字或下划线字符)
. 除换行符之外的所有字符
1. preg_match()函数
函数原型:int preg_match (string $pattern, string $content [, array $matches])
preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其 中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只 作一次匹配,最终返回0或1的匹配结果数。代码6.1给出
preg_match()函数在字符串中搜索模式,如果存在则返回true,否则返回false
代码如下$pattern="/php/";
$str="111cn.net";
echo preg_match($pattern,$str);
输出结果:1
2. preg_grep()函数
preg_grep()函数搜索数组中的所有元素,返回由与某个模式匹配的所有元素组成的数组
代码如下$pattern="/p$/";
$strArray=array("asp","php","jsp","python","ruby");
print_r(preg_grep($pattern,$strArray));
输出结果:
Array
(
[0] => asp
[1] => php
[2] => jsp
)
3. preg_match_all()函数
preg_match_all()函数在字符串中匹配模式的所有出现,然后将所有匹配到的全部放入数组
代码如下
//preg_match("正则表达式","字符串")用于在字符串中查找匹配项
$email = "987044391@qq.com";
if (preg_match("/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([.a-zA-Z0-9_-])+([.a-zA-Z0-9_-]+)+([.a-zA-Z0-9_-])$/",$email)){
echo "匹配成功
";
}else {
echo "匹配失败
";
}
//preg_quote("字符串") 在每个有正则表达式语法前面加入一个转义字符即\
$str = "php点点通是一个学习php的网站,(⊙o⊙)…";
echo preg_quote($str);
echo "
";
//preg_split("正则","字符串")分割字符串
$php = "+php++点点通++++是好网站";
$field = preg_split("/\+{1,}/",$php);
foreach($field as $f){
echo $f." ";
}
echo "
";
//preg_grep("正则","字符串") 与数组匹配后返回新数组
$phpddt = array("php点点通","php100","呵呵","hahaha","phpchina");
$item = preg_grep("/^php/",$phpddt);
print_r($item);
echo "
";
//preg_replace("正则","替换内容","原字符串") 很重要,很常用
$a = "欢迎光临http://www.111cn.net/"; //给http开头的加上超链接
echo preg_replace("/http:\/\/(.*)\//","\${0}","$a");
?>
4. preg_quote()函数
preg_quote()函数在每个对于正则表达式语法而言有特殊含义的字符前插入一个反斜线。
echo preg_quote("苹果的价格是:$5/千克");
输出结果:苹果的价格是:\$5/千克
5. preg_replace()函数
preg_replace()函数搜索到所有的匹配,然后替换成想要的字符串返回
代码如下$pattern="/php[1-5]/";
$str="php1php2php3php4php5php6php7php8";
echo preg_replace($pattern,"PHP",$str);
输出结果:PHPPHPPHPPHPPHPphp6php7php8
6. preg_split()函数
preg_split()函数以不区分大小写的方式分割字符串,将所得到的字串组成数组并返回
代码如下$pattern="/[\.@]/";
$str="feng.yingyuan@sina.com.cn";
print_r(preg_split($pattern,$str));
输出结果:
Array
(
[0] => feng
[1] => yingyuan
[2] => sina
[3] => com
[4] => cn
)
ereg()和eregi()
ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版 本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则 表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。
代码6.2 文件名的安全检验
$username = $_SERVER["REMOTE_USER"];
$filename = $_GET["file"];
//对文件名进行过滤,以保证系统安全
if (!ereg("^[^./][^/]*$", $userfile))
{
die("这不是一个非法的文件名!");
}
//对用户名进行过滤
if (!ereg("^[^./][^/]*$", $username))
{
die("这不是一个无效的用户名");
}
//通过安全过滤,拼合文件路径
$thefile = "/home/$username/$filename";
?>
通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数
preg_replace()
函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例
//字符串
$string = "Name: {Name}
/nEmail: {Email}
/nAddress: {Address}
/n";
//模式
$patterns =array(
"/{Address}/",
"/{Name}/",
"/{Email}/"
);
//替换字串
$replacements = array (
"No.5, Wilson St., New York, U.S.A",
"Thomas Ching",
"tom@emailaddress.com",
);
//输出模式替换结果
print preg_replace($patterns, $replacements, $string);
?>