LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1907|回复: 2

请教一个正则表达式

[复制链接]
发表于 2009-7-27 18:41:46 | 显示全部楼层 |阅读模式
初接触正则,请大家指教

我想过滤代码里
<object>.....</object>
这些代码,开始用这一条没有效果
preg_replace("/<object([.\s]+?)<\/object>/", "", $text);
我的想法是在这里“.”是除了\n之外的字符。“\s"是所有的whitespace,但这个不行

后来又换成
preg_replace("/<object([\S\s]*)<\/object>/", "", $text);
\s是whitespace,\S是非whitespace,*是没有或有很多此类字符。也是不行

最后换成了
preg_replace("/<object([\S\s]+?)<\/object>/", "", $text);
就OK了

我想问的是第一个的"."和\s\S有什么区别,另外第二个的*和+?又有什么区别呢。

另外有什么好一些的关于正则表达式的资料,也请推荐一些
发表于 2009-8-2 07:54:49 | 显示全部楼层
1. 在字符组[]内,点号.不再表示任意字符,只是一个普通的点号而已。因此,正则式[.\s]相当于一个点号或空白字符。因此不符合你的要求。

2. 有个multilines选项,可以让点号匹配新行,因此,这则表达式可以满足你的需要:
$result = preg_replace('%<object.*?</object>%s', '', $subject);
使用%...%的格式,是为了与/号区分开来,不再对其转义。
.*?是懒惰模式,见好就收,而不匹配<object>...</object>..<object>..</object>这样的模式。
加s表示多行模式。

3. [\s\S]的模式,在我这里也是可以的,代码如下:
$result = preg_replace('%<object([\S\s]*)</object>%', '', $subject);
你再试试?

4. 关于.和[\s\S]:点号一般来说,可以匹配除换行符之外的任何字符。当指定多行模式时,还可以匹配换行符。
而\s\S这个空白字符、非空白字符的集合,可以是任意字符,当然包括换行符。

5.*和+?
* 不定量词, 匹配0次或多次,默认是越多越好。
*? 不定量词, 匹配0次或多次,默认是越少越好。
+ 不定量词, 匹配1次或多次,默认是越多越好。
+? 不定量词, 匹配1次或多次,默认是越少越好。
例如,对于普通文本aaaaaaaaaa(10个a)
正则式
a* 匹配aaaaaaaaaa
a*? 不匹配任何内容(0个a)
a+ 匹配aaaaaaaaaa
a+? 匹配其中每一个a

6. 建议阅读:
余晟译《精通正则表达式》,第三版。
网址推荐:
正则式博客:http://iregex.org
正则式论坛:http://regex.me
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-6 13:29:23 | 显示全部楼层
多谢ls这么详细的解答,非常感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表