<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>闲人笔记</title>
		<link>http://it.fm707.com//</link>
		<description>工作是很无聊的，但偶尔也能找到点儿成就感～～</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Fri, 30 Jul 2010 02:48:28 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://it.fm707.com//show-3-1.html</guid>
			<title>在PHP里面运用与Perl兼容地正则表达式【转载】</title>
			<author>flycat</author>
			<description><![CDATA[<p><strong>1 前言</strong><br />
PHP被大量的应用于Web的后台CGI开发，通常是在用户数据数据之后得出某种结果，但是如果用户输入的数据不正确，就会出现问题，比如说某人的生日是&quot;2月30日&quot;！那应该怎么样来检验暑假是否正确呢？ 在PHP中加入了正则表达式的支持，让我们可以十分方便的进行数据匹配。</p>
<p><strong>2 什么是正则表达式：<br />
</strong>简单的说，正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹，例如：Perl或PHP脚本语言。此外，JavaScript这种客户端的脚本语言也提供了对正则表达式的支持，现在正则表达式已经成为了一个通用的概念和工具，被各类技术人员所广泛使用。 <br />
在某个Linux网站上面有这样的话：&quot;如果你问一下Linux爱好者最喜欢什么，他可能会回答正则表达式；如果你问他最害怕什么，除了繁琐的安装配置外他肯定会说正则表达式。&quot; <br />
正如上面说的，正则表达式看起来非常复杂，让人害怕，大多数的PHP初学者都会跳过这里，继续下面的学习，但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能，不学实在太可惜了&hellip;&hellip;</p>
<p><strong>3 正则表达式的基本语法：</strong><br />
一个正则表达式，分为三个部分：分隔符，表达式和修饰符。 <br />
分隔符可以是除了特殊字符以外的任何字符（比如&quot;/ !&quot;等等），常用的分隔符是&quot;/&quot;。表达式由一些特殊字符（特殊字符详见下面）和非特殊的字符串组成，比如&quot;[a-z0-9_-]+@[a-z0-9_-.]+&quot;可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子： <br />
/hello.+?hello/is <br />
上面的正则表达式&quot;/&quot;就是分隔符，两个&quot;/&quot;之间的就是表达式，第二个&quot;/&quot;后面的字符串&quot;is&quot;就是修饰符。 <br />
在表达式中如果含有分隔符，那么就需要使用转义符号&quot;\&quot;，比如&quot;/hello.+?\/hello/is&quot;。转义符号除了用于分隔符外还可以执行特殊字符，全部由字母构成的特殊字符都需要&quot;\&quot;来转义，比如&quot;\d&quot;代表全体数字。</p>
<p><strong>4 正则表达式的特殊字符：</strong><br />
正则表达式中的特殊字符分为元字符、定位字符等等。 <br />
元字符是正则表达式中一类有特殊意义的字符，用来描述其前导字符（即元字符前面的字符）在被匹配的对象中出现的方式。元字符本身是一个个单一的字符，但是不同或者相同的元字符组合起来可以构成大的元字符。 <br />
元字符： <br />
大括号：大括号用来精确指定匹配元字符出现的次数，例如&quot;/pre{1,5}/&quot;表示匹配的对象可以是&quot;pre&quot;、&quot;pree&quot;、&quot;preeeee&quot;这样在&quot;pr&quot;后面出现1个到5个&quot;e&quot;的字符串。或者&quot;/pre{,5}/&quot;代表pre出现0此到5次之间。 <br />
加号：&quot;+&quot;字符用来匹配元字符前的字符出现一次或者多次。例如&quot;/ac+/&quot;表示被匹配的对象可以是&quot;act&quot;、&quot;account&quot;、&quot;acccc&quot;等在&quot;a&quot;后面出现一个或者多个&quot;c&quot;的字符串。&quot;+&quot;相当于&quot;{1,}&quot;。 <br />
星号：&quot;*&quot;字符用来匹配元字符前的字符出现零次或者多次。例如&quot;/ac*/&quot;表示被匹配的对象可以是&quot;app&quot;、&quot;acp&quot;、&quot;accp&quot;等在&quot;a&quot;后面出现零个或者多个&quot;c&quot;的字符串。&quot;*&quot;相当于&quot;{0,}&quot;。 <br />
问号：&quot;?&quot;字符用来匹配元字符前的字符出现零次或者1次。例如&quot;/ac?/&quot;表示匹配的对象可以是&quot;a&quot;、&quot;acp&quot;、&quot;acwp&quot;这样在&quot;a&quot;后面出现零个或者1个&quot;c&quot;的字符串。&quot;?&quot;在正则表达式中还有一个非常重要的作用，即&quot;贪婪模式&quot;。</p>
<p>还有两个很重要的特殊字符就是&quot;[ ]&quot;。他们可以匹配&quot;[]&quot;之中出现过的字符，比如&quot;/[az]/&quot;可以匹配单个字符&quot;a&quot;或者&quot;z&quot;；如果把上面的表达式改成这样&quot;/[a-z]/&quot;，就可以匹配任何单个小写字母，比如&quot;a&quot;、&quot;b&quot;等等。 <br />
如果在&quot;[]&quot;中出现了&quot;^&quot;，代表本表达式不匹配&quot;[]&quot;内出现的字符，比如&quot;/[^a-z]/&quot;不匹配任何小写字母！并且正则表达式给出了几种&quot;[]&quot;的默认值： <br />
[:alpha:]：匹配任何字母 <br />
[:alnum:]：匹配任何字母和数字 <br />
[:digit:]：匹配任何数字 <br />
[:space:]：匹配空格符 <br />
[:upper:]：匹配任何大写字母 <br />
[:lower:]：匹配任何小写字母 <br />
[:punct:]：匹配任何标点符号 <br />
[:xdigit:]：匹配任何16进制数字</p>
<p>另外下面这些特殊字符在转义符号&quot;\&quot;转义后代表的含义如下： <br />
s：匹配单个的空格符 <br />
S：用于匹配除单个空格符之外的所有字符。 <br />
d：用于匹配从0到9的数字，相当于&quot;/[0-9]/&quot;。 <br />
w：用于匹配字母，数字或下划线字符，相当于&quot;/[a-zA-Z0-9_]/&quot;。 <br />
W：用于匹配所有与w不匹配的字符，相当于&quot;/[^a-zA-Z0-9_]/&quot;。 <br />
D：用于匹配任何非10进制的数字字符。 <br />
.：用于匹配除换行符之外的所有字符，如果经过修饰符&quot;s&quot;的修饰，&quot;.&quot;可以代表任意字符。</p>
<p>利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如&quot;/\d0000/&quot;利用上面的正则表达式可以匹配万以上，十万一下的整数字符串。</p>
<p>定位字符： <br />
定位字符是正则表达式中又一类非常重要的字符，它的主要作用是用于对字符在匹配对象中的位置进行描述。 <br />
^：表示匹配的模式出现在匹配对象的开头（和在&quot;[]&quot;里面不同） <br />
$：表示匹配的模式出现在匹配对象的末尾 <br />
空格：表示匹配的模式出现在开始和结尾的两个边界之一 <br />
&quot;/^he/&quot;：可以匹配以&quot;he&quot;字符开头的字符串，比如hello、height等等； <br />
&quot;/he$/&quot;：可以匹配以&quot;he&quot;字符结尾的字符串即she等； <br />
&quot;/ he/&quot;：空格开头，和^的作用一样，匹配以he开头的字符串； <br />
&quot;/he /&quot;：空格结束，和$的作用一样，匹配以he结尾的字符串； <br />
&quot;/^he$/&quot;：表示只和字符串&quot;he&quot;匹配。</p>
<p>括号： <br />
正则表达式除了可以用户匹配，还可以用括号&quot;()&quot;来记录需要的信息，储存起来，给后面的表达式读取。比如： <br />
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/ <br />
就是记录邮件地址的用户名，和邮件地址的服务器地址（形式为<a href="mailto:username@server.com">username@server.com</a>之类的），在后面如果想要读取记录下来的字符串，只是需要用&quot;转义符＋记录的次序&quot;来读取。比如&quot;<a href="file://0.0.0.1/">\\1</a>&quot;就相当于第一个&quot;[a-zA-Z0-9_-]+&quot;，&quot;<a href="file://0.0.0.2/">\\2</a>&quot;相当于第二个([a-zA-Z0-9_-]+)，&quot;<a href="file://0.0.0.3/">\\3</a>&quot;就是第三个(.[a-zA-Z0-9_-])。但是在PHP中，&quot;\&quot;是一个特殊的字符，需要转义，所以&quot;\1&quot;到了PHP的表达式中就应该写成&quot;<a>\\\\1</a>&quot;。 <br />
其他特殊符号： <br />
&quot;|&quot;：或符号&quot;|&quot;和PHP里面的或一样，不过是一个&quot;|&quot;，而不是PHP的两个&quot;||&quot;！意思就是可以是某个字符或者另一个字符串，比如&quot;/abcd|dcba/&quot;可能匹配&quot;abcd&quot;或者&quot;dcba&quot;。</p>
<p><strong>5 贪婪模式：<br />
</strong>前面在元字符中提到过&quot;?&quot;还有一个重要的作用，即&quot;贪婪模式&quot;，什么是&quot;贪婪模式&quot;呢？ <br />
比如我们要匹配以字母&quot;a&quot;开头字母&quot;b&quot;结尾的字符串，但是需要匹配的字符串在&quot;a&quot;后面含有很多个&quot;b&quot;，比如&quot;a bbbbbbbbbbbbbbbbb&quot;，那正则表达式是会匹配第一个&quot;b&quot;还是最后一个&quot;b&quot;呢？如果你使用了贪婪模式，那么会匹配到最后一个&quot;b&quot;，反之只是匹配到第一个&quot;b&quot;。 <br />
使用贪婪模式的表达式如下： <br />
/a.+?b/ <br />
/a.+b/U <br />
不使用贪婪模式的如下： <br />
/a.+b/ <br />
上面使用了一个修饰符U，详见下面的部分。</p>
<p><strong>6 修饰符：<br />
</strong>在正则表达式里面的修饰符可以改变正则的很多特性，使得正则表达式更加适合你的需要（注意：修饰符对于大小写是敏感的，这意味着&quot;e&quot;并不等于&quot;E&quot;）。正则表达式里面的修饰符如下： <br />
i ：如果在修饰符中加上&quot;i&quot;，则正则将会取消大小写敏感性，即&quot;a&quot;和&quot;A&quot; 是一样的。 <br />
m：默认的正则开始&quot;^&quot;和结束&quot;$&quot;只是对于正则字符串如果在修饰符中加上&quot;m&quot;，那么开始和结束将会指字符串的每一行：每一行的开头就是&quot;^&quot;，结尾就是&quot;$&quot;。 <br />
s：如果在修饰符中加入&quot;s&quot;，那么默认的&quot;.&quot;代表除了换行符以外的任何字符将会变成任意字符，也就是包括换行符！ <br />
x：如果加上该修饰符，表达式中的空白字符将会被忽略，除非它已经被转义。 <br />
e：本修饰符仅仅对于replacement有用，代表在replacement中作为PHP代码。 <br />
A：如果使用这个修饰符，那么表达式必须是匹配的字符串中的开头部分。比如说&quot;/a/A&quot;匹配&quot;abcd&quot;。 <br />
E：与&quot;m&quot;相反，如果使用这个修饰符，那么&quot;$&quot;将匹配绝对字符串的结尾，而不是换行符前面，默认就打开了这个模式。 <br />
U：和问号的作用差不多，用于设置&quot;贪婪模式&quot;。</p>
<p><strong>7 PCRE相关的正则表达式函数：</strong><br />
PHP的Perl兼容正则表达式提供的多个函数，分为模式匹配，替换和匹配数目等等： <br />
1、preg_match ： <br />
函数格式：int preg_match(string pattern, string subject, array [matches]); <br />
这个函数会在string中使用pattern表达式来匹配，如果给定了[regs]，就会将string记录到[regs][0]中，[regs][1]代表使用括号&quot;（）&quot;记录下来的第一个字符串，[regs][2]代表记录下来的第二个字符串，以此类推。preg如果在string中找到了匹配的pattern，就会返回&quot;true&quot;，否则返回&quot;false&quot;。</p>
<p>2、preg_replace ： <br />
函数格式：mixed preg_replace(mixed pattern, mixed replacement, mixed subject); <br />
这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符，则可以使用&quot;()&quot;来记录，在replacement中只是需要用&quot;<a href="file://0.0.0.1/">\\1</a>&quot;来读取。</p>
<p>3、preg_split ： <br />
函数格式：array preg_split(string pattern, string subject, int [limit]); <br />
这个函数和函数split一样，区别仅在与split可以使用简单正则表达式来分割匹配的字符串，而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。</p>
<p>4、preg_grep ： <br />
函数格式：array preg_grep(string patern , array input); <br />
这个函数和preg_match功能基本上，不过preg_grep可以将给定的数组input中的所有元素匹配，返回一个新的数组。</p>
<p>下面举一个例子，比如我们要检查Email地址的格式是否正确：</p>
<p>&lt;?php <br />
function emailIsRight($email) { <br />
if (preg_match(&quot;^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$&quot;,$email)) { <br />
return 1; <br />
} <br />
return 0; <br />
} <br />
if(emailIsRight(\'y10k@963.net\')) echo \'正确&lt;br&gt;\'; <br />
if(!emailIsRight(\'y10k@fffff\')) echo \'不正确&lt;br&gt;\'; <br />
?&gt;</p>
<p>上面的程序会输出&quot;正确&lt;br&gt;不正确&quot;。</p>
<p><strong>8.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别：</strong> <br />
虽然叫做&ldquo;Perl兼容正则表达式&rdquo;，但是和Perl的正则表达式相比，PHP的还是由一些不同，比如修饰符&ldquo;G&rdquo;在Perl里面代表全部匹配，但是在PHP中没有加入对这个修饰符的支持。 <br />
还有就是和ereg系列函数的区别，ereg也是PHP中提供的正则表达式函数，不过和preg相比，要弱上很多。</p>
<p>1、ereg里面是不需要也不能使用分隔符和修饰符的，所以ereg的功能比preg要弱上不少。 <br />
2、关于&quot;.&quot;：点在正则里面一般是除了换行符以外的全部字符，但是在ereg里面的&quot;.&quot;是任意字符，即包括换行符！如果在preg里面希望&quot;.&quot;能够包括换行符，可以在修饰符中加上&quot;s&quot;。 <br />
3、ereg默认使用贪婪模式，并且不能修改，这个给很多替换和匹配带来麻烦。 <br />
4、速度：这个或许是很多人关心的问题，会不会preg功能强大是以速度来换取的？不用担心，preg的速度要远远比ereg快，笔者做了一个程序测试：</p>
<p>time test:</p>
<p>PHP代码:</p>
<p>&lt;?php<br />
&nbsp;&nbsp;&nbsp; echo &quot;Preg_replace used time:&quot;; <br />
&nbsp;&nbsp;&nbsp; $start = time(); <br />
&nbsp;&nbsp;&nbsp; for($i=1;$i&lt;=100000;$i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $str = &quot;ssssssssssssssssssssssssssss&quot;; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_replace(&quot;/s/&quot;,&quot;&quot;,$str); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; $ended = time()-$start; <br />
&nbsp;&nbsp;&nbsp; echo $ended; <br />
&nbsp;&nbsp;&nbsp; echo &quot; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ereg_replace used time:&quot;; <br />
&nbsp;&nbsp;&nbsp; $start = time(); <br />
&nbsp;&nbsp;&nbsp; for($i=1;$i&lt;=100000;$i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $str = &quot;ssssssssssssssssssssssssssss&quot;; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ereg_replace(&quot;s&quot;,&quot;&quot;,$str); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; $ended = time()-$start; <br />
&nbsp;&nbsp;&nbsp; echo $ended; <br />
&nbsp;&nbsp;&nbsp; echo &quot; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_replace used time:&quot;; <br />
&nbsp;&nbsp;&nbsp; $start = time(); <br />
&nbsp;&nbsp;&nbsp; for($i=1;$i&lt;=100000;$i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $str = &quot;sssssssssssssssssssssssssssss&quot;; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_replace(&quot;s&quot;,&quot;&quot;,$str); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; $ended = time()-$start; <br />
&nbsp;&nbsp;&nbsp; echo $ended; <br />
?&gt; <br />
结果： <br />
Preg_replace used time:5 <br />
ereg_replace used time:15 <br />
str_replace used time:2</p>
<p><br />
str_replace因为不需要匹配所以速度非常快，而preg_replace的速度比ereg_replace要快上不少。</p>
<p><strong>9.关于PHP3.0对于preg的支持：</strong><br />
在PHP 4.0中默认加入了preg支持，但是在3.0中确没有。如果在3.0中希望使用preg函数，必须加载php3_pcre.dll文件，只要在php.ini的extension部分设置加入&quot;extension = php3_pcre.dll&quot;然后从新启动PHP就可以了！ <br />
其实正则表达式还常用于UbbCode的实现，很多PHP论坛都使用了这个方法（比如zForum zphp.com或者vB vbullent.com），但是具体的代码比较长。</p>]]></description>
			<link>http://it.fm707.com//show-3-1.html</link>
			<category domain="http://it.fm707.com//category-1-1.html">PHP</category>
			<pubDate>2009-07-29 23:02</pubDate>
		</item>
		<item>
			<guid>http://it.fm707.com//show-2-1.html</guid>
			<title>PHP正则表达式详解【转载】</title>
			<author>flycat</author>
			<description><![CDATA[<p><strong>一.正则表达式</strong><br />
1.匹配符<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)头匹配符&quot;^&quot;:如^0754,只匹配开头为0754的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)尾匹配符&quot;$&quot;:如0754$,只匹配结尾为0754的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3)全字匹配:将^和$结合,如^0754$,匹配0754字符串<br />
2.转义字符<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)空字符：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换行\n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车\r<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 制表符\t<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)其他字符：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;$&quot; \$<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;^&quot; \^<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;+&quot; \+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;/&quot; \/<br />
3.通配符<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)*号:用来匹配前面一个字符是否在字符串中出现零次或多次.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1:'abc*'，匹配含有ab的所有字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)+号:......................................一次或多次.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例2:'abc+'，匹配含有abc的所有字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3)?号:......................................零次或一次.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例3：只匹配含有ab、abc结尾不再含c的字符串。如abca，aabc，aaab都可以，但abcc就不行。<br />
4.关于转义字符\$与双、单引号(php4环境)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)正则表达式本身就是一个字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)当引号中含有$时，用双、单引号定义就有区别，区别如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)使用单引号定义时，解释器会把引号内所有字符(包括$在内)都原封不动的赋值给字符串变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)使用双引号定义时，解释器会把引号内&quot;$&quot;字符以及其后的合法字符(字母、数字、下划线)翻译成变量，直到遇到一个非法字符才认为变量名结束，该非法字符及其后面的字符都被视为一般字符赋给字符串变量，直到遇到下一个&quot;$&quot;为止。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)注意：单个$出现在双引号的尾部，并且其后面不再有任何字符的时候，解释器不会将其翻译成变量。也不需要加转义\，当然不提倡。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)如果待匹配的字符中本身就有$，就无法用双引号来定义这个正则表达式，原因是转义字符\$在单，双引号中表示的意义不同：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;1&gt;双引号中，\$和单个的$意义是一样的，都是代表尾匹配符，因此c\$$=c\$=c\$\$=c$=c\$\$；双引号中，\$在任何时刻都只代表一个字符&quot;$&quot;，echo &quot;c\$$&quot;结果是c$$，并且\$和单个的$(单个的$是指该$无法和其后字符组成变量名)是完全等效的，都是尾匹配符，所以双引号中是无法写入作为非尾匹配字符的字符&quot;$&quot;的，也正是这个原因，大多数需要匹配$时定义正则表达式只能用''。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;2&gt;单引号中，\$的意义仅仅表示字符&quot;$&quot;，尾匹配符是$，不管后面是否有合法变量名字符；单引号中，\$其实是两个字符，如不用于正则匹配将没有任何意义，echo 'c\$$'结果仍是c\$$。单作为正则表达式来使用，单引号中的\$表示的是特殊字符&quot;$&quot;，而尾匹配符就是单独的$字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3)正则表达式的尾匹配符&quot;$&quot;和变量的定义符是相同的：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例1：定义正则表达式为^ab$：$pattern=&quot;^ab\$&quot;;转义字符\$在双引号中就表示字符$，结果是^ab$。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例2：如上题，使用$pattern=&quot;^ab$&quot;;显然是错误的，但是由于$在尾部，后面没有其他字符，所以依然适用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例3：以字符组合c$结尾的正则表达式：$pattern='c\$$';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例4：如上题，$pattern=&quot;c\$$&quot;;正则表达式将\$视为尾匹配符，故只匹配以c结尾。<br />
<br />
5.&quot;[]&quot;方括号(字符簇)用法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)[]匹配一个字符，在[]中使用^开头表示取非，即其后的字符全部是不匹配的。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1：[a-zA-Z0-9]匹配所有大小写字母和数字。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例2：[\n\t\r\f]匹配所有空字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例3：[^A-Z]不匹配大写字母。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例4：^[^0-9]匹配不以数字开头的字符或字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)特殊字符&quot;.&quot;(句点)匹配除了&quot;新行&quot;之外的所有字符，模式^.abc$匹配任何以abc结尾的字符，但是不能匹配其本身。模式&quot;.&quot;则可以匹配任何字符串，除了空字符串和只有一个&quot;新行&quot;字符的字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1：'^.abc$';匹配所有尾部含有abc的字符串，不匹配小数(新行)，当不匹配abc。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例2：'.';匹配所有字符串，但不匹配空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例3：'.abc';匹配所有含abc的字符串，小数等等都可以，前提是不以abc为首，不匹配abc。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例4：'.abc$'；匹配所有以abc结尾的字符串，任何小数等等都可以，不匹配abc。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3)php提供了内置通用字符簇：<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:alpha:]]任何字母<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:digit:]]任何数字<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:alnum:]]任何字母和数字<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:space:]]任何空白字符<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:upper:]]任何大写字母<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:lower:]]任何小写字母<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:punct:]]任何表点符号<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:xdigit:]]任何十六进制数字<br />
&nbsp;&nbsp;&nbsp;&nbsp; [[:cntrl:]]任何ASCII值小于32的字符<br />
&nbsp;&nbsp;&nbsp;&nbsp; 注意：以上字符簇有个特点，只要被匹配的字符或字符串中有此字符，即匹配正确，不管字符串是以什么方式组成的。<br />
6.&quot;{}&quot;大括号用法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)方括号只能匹配一个字符，而匹配多个字符只能用{}实现：{}用来确定前面内容出现的次数。{n}表示出现n次；{m,n}表示出现m~n次，包括m和n次；{n,}表示出现n次或者n次以上。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1:^a{10}$;匹配aaaaaaaaaa。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例2:[0-9]{1,}$;匹配所有&gt;0的数。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)&quot;{}&quot;与通配符之间的关系<br />
&nbsp;&nbsp;&nbsp;&nbsp; ?&nbsp;&nbsp; 相当于 {0,1} 零次或一次<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; ..... {0,} 零次或无数次<br />
&nbsp;&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp; ..... {1,} 一次或无数次<br />
7.&quot;()&quot;用法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 圆括号&quot;()&quot;括住的pattern表示子模式，如$pattern='([1-9]{1}[0-9]{3})-([0-1]{1}[1-2]{1})-([0-3]{1}([0-9]|))';()扩住的就是一个个子模式，()相当于把他们独立起来，分别匹配而相互不干扰。</p>
<p><strong>二.POSIX风格正则表达式函数<br />
</strong>1.ereg<br />
&nbsp;&nbsp;&nbsp;&nbsp; ereg(pattern,string,[array $regs]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; eregi(pattern,string,[array $regs]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; ereg函数在string中找到满足pattern模式的文本，如果找到true，没找到false。如果有第三个参数$regs，那找到的文本将放在$regs[0]中，并且regs数组中将一次存放各个圆括号表达的子模式匹配的结果。$regs[1]中存放了第一个子模式所匹配的结果，$regs[2]中是第二个，顺序从左到右，依次类推。如果没有找到匹配的文本，$regs数组的值不会被改变。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 注意：如果找到了匹配的文本，不管找到的子模式是多少个&gt;9还是&lt;9，ereg()只会改变$regs数组前10个元素的值。但是这不会影响函数对子模式组合的匹配结果。ereg总是先匹配完，如果没发现匹配的文本就false，发现了就true。如果有子模式，会逐步根据这些子模式重新在字符串中寻找匹配的文本，直到$regs数组被填满10个元素或者所有子模式被匹配完，如果子模式少于10则剩余的$regs将被赋空值。总之一句话，匹配归匹配，$regs归$regs，$regs只有10个值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; eregi()函数与ereg()基本用法相同，只是eregi对大小写不敏感。<br />
2.ereg_replace和eregi_replace<br />
&nbsp;&nbsp;&nbsp;&nbsp; ereg_replace(pattern,string replacement,string)<br />
&nbsp;&nbsp;&nbsp;&nbsp; eregi_replace(pattern,string replacement,string)<br />
&nbsp;&nbsp;&nbsp;&nbsp; string字串中满足pattern的文本将被替换成replacement。如果string中有pattern匹配的文本，那么返回替换之后的值，如果没有，则返回原来的string值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果pattern中包含子模式，子模式可以有选择的被保留而不被替换。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1：pattern中的第二个子模式不被替换，replacement可写成这样:replacement\\2。这样string中匹配的pattern的字符串将被替换为replacement+pattern2，pattern2表示匹配pattern的文本中又匹配pattern的第二个子模式的文本。如果使用&quot;\\0&quot;表示保留整个匹配文本。利用这个特性可以实现在特定的字符串之后插入文本的操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp; replacement必须是字符串类型变量，如果不是，替换时将强制转换成字符串类型。<br />
3.split()函数和spliti()函数用法<br />
&nbsp;&nbsp;&nbsp;&nbsp; split(pattern,string,[int limit]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; spliti(pattern,string,[int limit]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; split以正则表达式pattern定义的模式为分隔符将string分隔成几个部分。如果分隔成功，返回的值为各个分隔后部分组成的数组，失败则返回false。可选limit表示最大分割块数。如果limit为5，那么即使string有&gt;5个的地方符合pattern，string也只被分割为5个部分，最后一个部分是string去掉前四个部分后剩下的部分。返回值中也只有5个元素。<br />
三.perl风格正则表达式及相关函数<br />
1.perl正则语法<br />
&nbsp;&nbsp;&nbsp;&nbsp; perl分隔符，可使用&quot;/&quot;,&quot;!&quot;和&quot;{}&quot;。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例1：/^[^0-9]/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !^[0-9]!&nbsp;&nbsp;&nbsp;&nbsp; {^[0-9]}三个都一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在分隔符内部，分隔字符本身就是一个特殊敏感字符，要进行转义。如果用分隔符&quot;/&quot;，正则中又用了表达字符的&quot;/&quot;，则必须要用&quot;\/&quot;。如果混合用&quot;/&quot;和&quot;!&quot;就没问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例2：/\/\/$/&nbsp;&nbsp;&nbsp;&nbsp; !//$! 两者也相同<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例3：!^\!\![0-9]$!&nbsp;&nbsp;&nbsp;&nbsp; /^!![0-9]$/ 两者也相同<br />
2.perl特殊意义字符<br />
&nbsp;&nbsp;&nbsp;&nbsp; \a ASCII值为7的告警符<br />
&nbsp;&nbsp;&nbsp;&nbsp; \b 词的边界<br />
&nbsp;&nbsp;&nbsp;&nbsp; \A 和脱出符号(&quot;/&quot;)等价<br />
&nbsp;&nbsp;&nbsp;&nbsp; \B 非词边界<br />
&nbsp;&nbsp;&nbsp;&nbsp; \cn 控制字符<br />
&nbsp;&nbsp;&nbsp;&nbsp; \d 单个数字<br />
&nbsp;&nbsp;&nbsp;&nbsp; \D 单个非数字<br />
&nbsp;&nbsp;&nbsp;&nbsp; \s 单个空白<br />
&nbsp;&nbsp;&nbsp;&nbsp; \S 单个非空白<br />
&nbsp;&nbsp;&nbsp;&nbsp; \w 单个的字母或下划线<br />
&nbsp;&nbsp;&nbsp;&nbsp; \W 单个的非词字符(不是字母也不是下划线)<br />
&nbsp;&nbsp;&nbsp;&nbsp; \Z 从目标字串的尾部开始匹配<br />
3.高级特性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)或运算&quot;|&quot;：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如!^ex|em!匹配条件是ex或em开头的字符串，还可以写成!^e(x|m)!。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：()内的内容代表子模式\<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)逻辑符号后面的模式选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !正则表达式!逻辑选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A：只匹配位于目标字串开头的字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E：该选项使转义字符$构成的正则表达式只匹配目标字符串的结尾字符。如果选择m选项，该选项就被忽略。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; U：该选项禁止最大长度的搜索。一般情况下，搜索会尽量找最长的匹配字符串。例如模式/a+/在&quot;caaaaab&quot;字符串中的匹配结果是&quot;aaaaa&quot;，但是使用该选项的模式/a+/U匹配的结果会是&quot;a&quot;。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S：对模式进行学习，提高查找速度。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i：该选项忽略大小写。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m：该选项将含有换行符的字符串视为多行而不是一行。这个时候&quot;$&quot;，&quot;^&quot;等字符会匹配每个换行符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s:该选项使句点&quot;.&quot;也匹配换行符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x:该选项通知PHP解释器在分析的时候忽略正则表达式定义中的非转义空格符。这样可以在正则表达式中使用空格来增强其可读性，但这时在表达式中使用空格符必须使用转义字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3)扩展模式符号。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?#comment)&nbsp;&nbsp;&nbsp;&nbsp; 添加注释comment，可以增强正则可读性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?=pattern)&nbsp;&nbsp;&nbsp;&nbsp; 指定在模式之后必须跟随值pattern。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?!pattern)&nbsp;&nbsp;&nbsp;&nbsp; 指定在模式之后不能跟随值pattern。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在模式内部而非结尾处定义模式选项n。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?: )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 消耗字符，不捕获匹配结果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例:echo ereg(&quot;?:^a$&quot;,&quot;a&quot;);//无任何输出。 <br />
<br />
4.per正则函数<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.preg_grep函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_grep(pattern,array input);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入数组input中寻找匹配模式pattern的字串，并将所有的匹配字符串返回。返回值就是所有匹配的字符串组成的数组。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2.preg_match函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_match(pattern,string subject,[array matches])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数在subject字符串中寻找匹配pattern的字符串。如果找到则返回一个非零值，否则返回零值。如果选用了可选项matches，那么匹配的字符串将被放到第一个元素的位置，可以用$matches[0]来读取，圆括号匹配的结果也按顺序放在这个数组中，第一个是$matches[1]，第二个是$matches[2]，依次类推。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3.preg_match_all函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_match_all(pattern,subject,array matches,[int order])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数在subject字符串中寻找匹配pattern的互不重叠的文本，找到了匹配的文本则返回匹配文本的个数，否则返回0。匹配文本被放在二维数组matches中，matches[0]中存放的是所有符合的字符串。各种嵌入的子模式匹配的结果依次放在数组matches[1]~[n]中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order参数可选，可取的值为PREG_PATTERN_ORDER和PREG_SET_ORDER。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 4.preg_replace函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_replace(pattern,replacement,subject,[int limit])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数将subject中符合pattern模式的部分替换成replacement，返回值类型和subject类型一样，如果有替换，则返回替换后的值，反之则返回原来的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数可以是数组也可以是变量，有几种情况：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;1&gt;如果subject参数是数组类型。函数对每一个数组元素进行替换操作；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;2&gt;如果pattern是数组则函数根据每一个pattern中的类型进行替换；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;3&gt;如果pattern和replacement都是数组，则按两个数组中的元素对应完成替换；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;4&gt;如果replacement中的元素个数少于pattern中的元素个数。那么不够的部分将有空字符串来代替。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 5.preg_split函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preg_split(pattern,subject,[int limit][flages])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数以pattern定义的模式为分隔符将subject字符串分隔为若干个部分，返回数组，其中存放被分隔后的字符串。limit可限制返回字符串的数目，如果设置为-1表示对返回的字符串数目不加任何限制。flags也是可选项，其有两个值：PREG_SPLIT_NO_EMPTY设定函数不返回空字符串，PERG_SPLIT_DELIM_CAPTURE，该选项设定pattern中的嵌入子模式也会被函数匹配。</p>]]></description>
			<link>http://it.fm707.com//show-2-1.html</link>
			<category domain="http://it.fm707.com//category-1-1.html">PHP</category>
			<pubDate>2009-07-29 22:58</pubDate>
		</item>
		<item>
			<guid>http://it.fm707.com//show-1-1.html</guid>
			<title>PHP序列化和转码需要注意的事情</title>
			<author>flycat</author>
			<description><![CDATA[<p>前几天在做一个项目，碰到这样一个问题：</p>
<p>从服务端A post一个数组参数到另一台服务器B，数组是序列化后传递，服务端A用的是utf-8，服务端B用的是gbk(没办法，因为其他原因实际需要这么设置，不是我喜欢没事找事～)。</p>
<p>一开始测试的时候都用英文，都能成功，也没太在意。后来突然传了一串中文字符，结果到服务端B发现中文变成了乱码。编码问题，几乎而且完全确定和肯定～ 折腾了一会儿，终于用iconv搞定了转码。。</p>
<p>但是新的问题又来了。。服务端B接收不到数组。。汗～～写了log检测，发现数据传递是成功的，数组参数也确实传递过去了，编码转换也没问题～～可是。。反序列化就是得不到数组～～那问题应该就是在数组的序列化和反序列化上面了。。</p>
<p>结果又折腾了好久。。找了好多资料，又不断重复调试，切回英文是成功的，切到中文就不行～～冷静。。冷静。。哦。。忽然间想到。。utf-8的长度为3个字节，gbk的长度是2个字节，会不会是这个原因。</p>
<p>回过头去检查，才发现当时为了图方便，是将数组序列化后进行转码。。问题就来了。。因为反序列化是根据指定的长度进行的，假设有一个字符串&nbsp;<strong>&quot;中文&quot;</strong>, utf-8长度为3，序列化后是 <font style="background-color: #0000ff" color="#ffffff">s:6:&quot;中文&quot;</font>，再做一下转码，还是 <font style="background-color: #0000ff" color="#ffffff">s:6:&quot;中文&quot;</font>，可是这时候 <strong>&quot;中文&quot;</strong> 两个字的实际长度是4，结果反序列化的时候长度不匹配，就导致反序列化错误，输出空对象了～～偷懒惹的祸啊。。改吧～</p>
<p>后来修改了一下转码函数，加了个递归，实现了对数组的转码，将数组转码后再序列化，传过去反序列化。。搞定！</p>
<p><strong>总结两点：</strong></p>
<p><font color="#ff0000">1) 没事儿尽量不要玩多编码通信，能统一编码尽量统一</font></p>
<p><font color="#ff0000">2) 万一没办法要用到多编码通信，在进行跟长度有关的操作，例如截取字符串/序列化和反序列化等这类操作的时候千万要注意中文字符的长度～～</font></p>
<p><font color="#ff0000">另外，补充一点。。注意文件的实际存放编码，这个可能也是一些问题的源头～</font></p>]]></description>
			<link>http://it.fm707.com//show-1-1.html</link>
			<category domain="http://it.fm707.com//category-1-1.html">PHP</category>
			<pubDate>2009-07-25 00:54</pubDate>
		</item>
	</channel>
</rss>
