PHP正则表达式教程

来源:互联网 发布:淘宝物流管理软件 编辑:程序博客网 时间:2024/05/03 11:52


基本语法

首先看下 '^' 和 ‘$’ ,它们是匹配开始和结束的字符,如:

"^The":匹配任意以 "The" 开头的字符串,如 "There";

"despair&" :匹配任意以"despair"结尾的字符串,如"of despair";

"^abc$":匹配以"abc"开头并且以"abc"结尾的字符串---当然这就只能是"abc"了;

"notice":匹配包含notice的字符串,如 anoticeb;


符号 '*'  、'+'  、'?' ,作用是匹配目标字符串的次数,它们代表匹配  "任意次数"、"至少一次"、"零或一次",如:

"ab*":将匹配任意次数的b,如 "a"、"ab"、"abbb";

"ab+":至少匹配一次b,如 "ab"、"abbbb";

"ab?":出现一次b或者不出现,"ab";

还可以使用括号来表示次数范围:

"ab{2}":匹配 "abb";

"ab{2,}":表示至少匹配2个b,如"abb","abbbb";

"ab{3,5}":表示匹配3-5个b,即"abbb"、"abbbb"、"abbbbb";

注意你必须始终指定括号范围的第一个数,如{0,2}而不是{,2},后一个数可以省略表示无限多,你可能已经注意到与'*'、'+'、‘?’相同功能的表达式:{0,}、{1,}、{0,1}


现在是将简单符号结合使用的时候:

"a(bc)*":匹配任意次数的bc,括号的作用是将括号内看作一个整体;

"a(bc){1,5}":匹配1-5次bc;

这还有一个符号 "|" 表示 或者:

"hi|hello":表示匹配"hi"或者"hello";

"(b|cd)ef":匹配"bef"或"cdf";

"(a|b)*c":匹配任意次数 (a或b) + c;


'.'代表任意单字符:

'a.[0-9]':表示匹配 a+一位数字;

'^.{3}$':表示长度为3的字符串;

方括号 '[]' 用于表示字符串范围:

'[abc]':匹配abc间任意字符,等价与 "a|b|c";

'[a-d]':匹配a-d间任意字符;

'[a-zA-Z]':匹配任意字母;

'^[a-zA-Z]':匹配以字母开头的字符串;

你也可以使用 '^' 列出不想匹配的字符串范围,如 '^a[^a-zA-Z]b$' 表示匹配以a开头以b结尾并且中间一位不为字母的支付串;

如果需要匹配特殊字符如 "^.[]$()*+?{}\"等,必须在前面加上'\'进行转义。

除此之外还有一些特殊用法:

\s :空白字符串

\S:非空白字符串

\d:数字

\D:非数字

\w:字母

\W:非字母

下面是一些常用表达式:

([A-Za-z0-9]+)    数字或字母;

([^\s]+(?=\.(jpg|gif|png))\.\2)   jpg,gif,png图片;

(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})  邮件


php正则表达式函数:

preg_replace   (PHP 4, PHP 5)

preg_replace执行正则表达式的搜索和替换

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit ] )

      在 subject 中搜索pattern 模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit 个匹配,如果省略limit 或者其值为 -1,则所有的匹配项都会被替换。

replacement 可以包含 \\n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中\\0$0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。

对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 \\1 符号来表示逆向引用。举例说\\11,将会使preg_replace() 搞不清楚是想要一个\\1 的逆向引用后面跟着一个数字1 还是一个\\11 的逆向引用。本例中的解决方法是使用\${1}1。这会形成一个隔离的$1 逆向引用,而使另一个1 只是单纯的文字。

<?php$string = "April 15, 2003";$pattern = "/(\w+) (\d+), (\d+)/i";$replacement = "\${1}1,\$3";print preg_replace($pattern, $replacement, $string);/* Output   ======April1,2003 */?>

      如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的subject

preg_replace() 的每个参数(除了limit)都可以是一个数组。如果patternreplacement 都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个pattern 将被哪个replacement 来替换,应该在调用preg_replace() 之前用ksort() 对数组进行排序。     

<?php$string = "The quick brown fox jumped over the lazy dog.";$patterns[0] = "/quick/";$patterns[1] = "/brown/";$patterns[2] = "/fox/";$replacements[2] = "bear";$replacements[1] = "black";$replacements[0] = "slow";print preg_replace($patterns, $replacements, $string);/* Output   ======The bear black slow jumped over the lazy dog.*//* By ksorting patterns and replacements,   we should get what we wanted. */ksort($patterns);ksort($replacements);print preg_replace($patterns, $replacements, $string);/* Output   ======The slow black bear jumped over the lazy dog.*/?>

      如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。

如果 patternreplacement 都是数组,则preg_replace() 会依次从中分别取出值来对subject 进行搜索和替换。如果replacement 中的值比pattern 中的少,则用空字符串作为余下的替换值。如果pattern 是数组而replacement 是字符串,则对pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。

/e 修正符使 preg_replace()replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含preg_replace() 的行中出现语法解析错误。     

preg_match  (PHP 4, PHP 5)

preg_match进行正则表达式匹配

int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )

      在 subject 字符串中搜索与pattern 给出的正则表达式相匹配的内容。

如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。     

preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。     
Tip如果只想查看一个字符串是否包含在另一个字符串中,不要用 preg_match()。可以用 strpos() 或 strstr() 替代,要快得多。

Example #1 在文本中搜索“php”<?php// 模式定界符后面的 "i" 表示不区分大小写字母的搜索if (preg_match ("/php/i", "PHP is the web scripting language of choice.")) {    print "A match was found.";} else {    print "A match was not found.";}?>

Example #2 搜索单词“web”<?php/* 模式中的 \b 表示单词的边界,因此只有独立的 "web" 单词会被匹配, * 而不会匹配例如 "webbing" 或 "cobweb" 中的一部分 */if (preg_match ("/\bweb\b/i", "PHP is the web scripting language of choice.")) {    print "A match was found.";} else {    print "A match was not found.";}if (preg_match ("/\bweb\b/i", "PHP is the website scripting language of choice.")) {    print "A match was found.";} else {    print "A match was not found.";}?>

Example #3 从 URL 中取出域名<?php// 从 URL 中取得主机名preg_match("/^(http:\/\/)?([^\/]+)/i",    "http://www.php.net/index.html", $matches);$host = $matches[2];// 从主机名中取得后面两段preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);echo "domain name is: {$matches[0]}\n";?>


preg_split   (PHP 4, PHP 5)

preg_split用正则表达式分割字符串

array preg_split ( string $pattern , string $subject [, int $limit [, int $flags ]] )

    返回一个数组,包含 subject 中沿着与pattern 匹配的边界所分割的子串。

如果指定了 limit,则最多返回 limit 个子串,如果limit 是 -1,则意味着没有限制,可以用来继续指定可选参数flags

flags 可以是下列标记的任意组合(用按位或运算符 | 组合):    

PREG_SPLIT_NO_EMPTY    如果设定了本标记,则 preg_split() 只返回非空的成分。 PREG_SPLIT_DELIM_CAPTURE    如果设定了本标记,定界符模式中的括号表达式也会被捕获并返回。本标记添加于 PHP 4.0.5。 PREG_SPLIT_OFFSET_CAPTURE    如果设定了本标记,如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
Tip如果不需要正则表达式的功能,可以选择使用更快(也更简单)的替代函数如 explode() 或 str_split()。


原创粉丝点击