php preg_replace 用法,preg_replace 基础入门应用

$str="as2223adfsf0s4df0sdfsdf";

echo preg_replace("/0/","",$str);//去掉0字符,此

时相当于 replace的功能, preg_replace

("/0/","A",$str);  这样就是将0变成A的意思了

echo preg_replace("/[0-9]/","",$str);  //去掉所有数

echo preg_replace("/[a-z]/","",$str); //这样是去掉

所有小写字母

echo preg_replace("/[A-Z]/","",$str);//这样是去掉

所有大写字母

echo preg_replace("/[a-z,A-Z]/","",$str); //这样是去掉

所有字母

echo preg_replace("/[a-z,A-Z,0-9]/","",$str); //去掉所有字

母和数字

经过以

上的例子,相信大家知道,[ ] 和里面的, 有什么作用了。匹配的字符

串必须加 / / (看例子的第一个参数)

继续深一点的例子:

$str="acsdcs<55555555>sc<6666>sdcd";

echo preg_replace("/<.>/","",$str); //这个是表

示去除以结尾的那部份,输出结果是:acsdcssdcd

注意:上面的 .* 是表示任何字符,也就是说不管<>包住的是什么都去掉

其中. 表示任意字符,* 表示任意个数

现在我们来改动一下,如果

不想是任何个数呢?

$str="acsdcs<55555555>sc<6666>sdcd";

echo preg_replace("/<.>/","",$str);   //

此时输出: acsdcs<55555555>scsdcd 因为{4}指定了条件:<>内为4个字符

的才满足条件,所以<55555555>不符合条件,没有被替换。

注意:这时我们又学到了一个知识点{数字} 表示指定前面的个数,*就表示是任意个(0--

无限个)

表示重复次数的除了 *, {指定次数} 表示,还有很多表达

形式:

$str="acsdcs<55555555>sc<6666>sd<>cd";

echo preg_replace("//","",$str);  //输出

acsdcscd

echo "


";

echo preg_replace("//","",$str); //输入

acsdcsscsd<>cd

上面的例子只要是

为了 表达 * 与+的区别 , * 表示重复0数或n 次,而+ 表示1次以上,即一例中

9]+ >表示<>里面至少要有一个数字才符合条件。

为什么上例中用* 和用+输出的结果不同了吧

再来:

$str="acsdcs<55555555>sc<6666>sd<>cd";

echo preg_replace("//","",$str);

//输出acsdcs<55555555>sc<6666>sdcd

看[0-9]?这里的?表示

要是0次或1 次,超过1次又不符合条件了。

总结一下,上面我们学

会了 * + ? 和大括号{}表示重复次数的方法。

{}表示次数还可以再

复杂点:

$str="acs<22>dcs<55555>sc<333>sd<4444>cd&quo

t;;

echo preg_replace("/<.>/","",$str);

//输出结果:acs<22>dcsscsdcd

上式表示只要是3至5次都符合条

件,<22>就不符合条件了,所以没有被替换

再来

学多几个正则表达式的元字符:

$str="sfsdf3333sdfsd222fsdf666sdf";

echo preg_replace

("/[0-9]*/","",$str);  //去除所有字符

可能每次都用[0-9]表示数字有点麻烦,所以正则用了个 \d表示数字。因此上面可

以改成:

echo preg_replace("/

\d*/","",$str);

$str="sfsdf3333s

dfsd222fsd f666sdf";

echo preg_replace("/

\s*/","",$str);       //输出sfsdf3333sdfsd222fsdf666sdf

\s 在这里表示空格的意思

还有一些转义字符,大家可以自己试下

\w 表示字母或数字或下划线或汉字//这个容易理解

\b 表示单词的开头或结束 //这个有点难理解,什么是单词的开头?

看例:

$str="applegone

open";

echo preg_replace("/o*/","",$str); //

替换字符的o字符,结果会输出:applegne pen

$str="applegone open";

echo preg_replace("/

\bo*/","",$str); // 这时是输出applegone pen ,第一个o并没有被替

换,为什么呢? 因为 \bo 指明了o必须是单词的开头才符合条件。

OK,看到这里,明白什么叫单词的开头了吧?

继续

$str="applegone open go";

echo preg_replace

("/o|g/","",$str);//o|g 中间的|表示或者的意思, 此句的的意

思是替换o或者g

$str="applegone open go";

echo preg_replace("/\bo|o\b/","",$str); //输出

applegone pen g 因为上面说过了,\b 可以表示单词的开头或结尾,

因此上

例的意思是替换在单词开头的o或在单词结尾的o

继续

^

是表示字符串开头的意思,$表示字符串的结尾的意思

$str="applegaone

an apple open go";

echo preg_replace("/

\ba/","",$str); //结果输出:pplegaone n pple open go 替换了单词

的开头的a

echo preg_replace

("/^a/","",$str); //结果输出:pplegaone an apple open go 只

替换了字符串开头的 a

如果明白了^ , 也会明白了 $ 的意思了吧?

^ 表示字符串的开头,$表示字符串的结尾。

時候,我們需面對一種

特殊的情況,請看下例:

$str="a2b333a56b33b";

echo preg_replace("/a.*b/","",$str); //本來是想替換

a2b 和a56b的,但輸出結果卻是空白

想一下,為什麼上例輸出結果

是空白呢? 因為整個字符串是以a 开头,以b结尾。所以把整个字符串都替换了。

当一个表达式既符合短字符串的匹配,又符合长字符串的匹配,正则表

达式在默认情况,是匹配最长的那个,这种情况叫做正则表达式贪婪匹配

即匹配尽量多的字符。

加深一下理解,再试下下面几个例:

$str="abb3";

echo preg_replace

("/a.*b/","",$str); //输出3 , 按照贪婪匹配的原则, a.*b 匹

配的是abb,而不是ab

$str="aabb5"; //嵌套的情况,

echo preg_replace("/a.*b/","",$str); // 输出5,按照贪

婪匹配的原则, a.*b 匹配的是aabb,而不是中间的ab

可能这时候你

会问,如果我真想替换是中间的ab字符,而不想替换aabb呢,那么你又需要学习:懒惰匹

$str="5abb5";

echo preg_replace("/a.*?

b/","",$str); //输出5b5 , *?表示匹配任意的次,但尽量少, 所以只

替换5abb5中的ab,而不是abb

$str="5a1b22b5";

echo preg_replace("/a.*?b/","",$str); //输出 522b5 *?

匹配最少的那个 a1b,而不是 a1b22b

注意:懒惰匹配是指嵌套情况下的最少重

复。

请看下例:

$str="5a1ba22b5";

echo

preg_replace("/a.*?b/","",$str); //输出结果是55, a1b 和a22b

并不是嵌套关系,所以这个不能用懒惰匹配来解释,此例可以看作是替换了a1b和a22b。

总结一下:贪婪匹配匹配尽量多的字符,懒惰匹配匹配尽量

少的字符

懒惰匹配还有其它的表达方式:

*?

重复任意次,但尽可能少重复

+? 重复1次以上,但尽可能少重复

重复0次或1次,但尽量少重复

{n,m}? 重复n到m次,但尽量少重复

{n,}? 重复n次以上,但尽量少重

懒惰匹配还有个特殊的

情况:

$str="aabab";

echo preg_replace("/a.*?

b/","",$str); //此时输出的结果是空白

为什么上例中a.*?b

替换了整个字符串? 其实,并不是因为替换了整个字符串,而是 替换了aab 和

ab

具体实例:

去掉所有HTML标识

如你有一份HTML

PHP正则表达式

Click

Here

当你用PHP的 file_get_contents 把它全部读入了 一个字符串 $str之

后。

如果你只需要这份文件里面的文字,不要其它HTML标记。如何

去掉呢?

先分析一下,不管什么HTML标记,都有个特点:以

结尾,我们只需要去掉以 结尾的字符即可

可能你会想到用以

下的表达式

$str= preg_replace

("/<.>/","",$str); // 这样可不行。为什么?试验一下,

看下例:

$str="111

333
88";

echo preg_replace("/<.>/","",$str); //结果输出

11188, 它把333也去掉了,我们只想去掉

的原理,这个表达式会去掉:

333

那么,我们改为使

用懒惰匹配

$str="111

333
88";

echo preg_replace("/<.>/","",$str); //结果输

出:11133388 正是我们想要的结果

有时候,HTML标记常会出现嵌套

的现象:

$str="111

3
444
33
88"

;;

echo preg_replace("/<.>/","",$str);//

结果输出:11134443388 也是我们想要的结果

去掉超级链接

如果我们并不想去掉超级链接,而是想去掉超级链接标识呢?

先分析一下超链接标识的特点,

href="aa.php">Click Herer

还可能有

class="a1" href="aa.php">Click Here

class="a1" href="aa.php" target=_blank >Click

Here

还可能有大小写不同的情况

HREF="aa.php">Click Herer

不管什么情况, 肯定是

$str="111

88";

echo preg_replace("/

88 ,而

没有去掉

改进一下:

$str="111

href=''>

88";

echo preg_replace("/

href=''>|/i","",$str); //

要用

表示,加斜杠表转义,否则会出错的,加i是为了不区分大小写

例中输出了11188 ,是正确去掉超链接标识了,但上例的表达式壮健性太差了,稍有变化

,就会出错。

稍变一下:

$str="111

href=''>

88"; // 如果href 前面多几个空格

echo

preg_replace("/

href=''>|/i","",$str); //输出111

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值