PHP正则表达式

本文详细介绍了正则表达式的各种元字符,包括匹配特定字符、重复模式、模式修正符等,以及如何使用PHP中的preg_match、preg_match_all、preg_replace和preg_split函数进行正则表达式的操作。

//正则匹配真的会让人疯掉............

0x01 正则匹配的元字符

 

.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
[x]匹配x字符,如匹配字符串中的[a]则匹配字符a
\W\w的反义,即匹配任意非字母,数字,下划线和汉字的字符
\S\s的反义,即匹配任意非空白符的字符
\D\d的反义,即匹配任意非数字的字符
\B\b的反义,即不是单词开头或结束的位置
[^x]匹配除了 x 以外的任意字符,如 [^abc] 匹配除了 abc 这几个字母之外的任意字符

 提示

1.当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 \ 来表示转义,如要匹配 . 符号,则需要用 \. ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 \ ,则需要写成 \\

2.连续的数字或字母可以用 – 符号连接起来,如 匹配所有的小写字母,[1-5] 匹配 1 至 5 这 5 个数字

举个简单的匹配

^\d{5,}$

1.  ^  匹配开始

2.  \d 匹配数字

3.  {5,}至少匹配5位数以上

4.   $  表示字符串匹配的结束


 0x02 正则匹配中的重复

*重复零次或者更多次
+重复1次或者更多次
重复零次或者1次
{n}重复n次
{n,}重复n次或者更多次
{n,m}重复n到m次

 

 

 

 

 

 

 

 


0x03 模式修正符

i模式中的字符将同时匹配大小写字母
 字符串视为多行
s 将字符串视为单行,换行符作为普通字符
 将模式中的空白忽略
e preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
A 强制仅从目标字符串的开头开始匹配
 模式中的 $ 元字符仅匹配目标字符串的结尾
U 匹配最近的字符串
 模式字符串被当成 UTF-8

 

 

 

 

 

 

 

 

 

 

 

 


0X04 正则表达式

preg_match()

preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 ,第一次匹配成功后就会停止匹配。

preg_match ( pattern,  subject [, array matches ] )。

pattern :正则表达式

subject:需要匹配检索的对象

matches:可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推

preg_match_all()

preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。可匹配多次。

preg_replace()

preg_replace() 函数用于正则表达式的搜索和替换。

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

pattern:正则表达式

repalacement:替换的内容

subject:需要匹配替换的对象

limit:可选,指定替换的个数,如果省略或为-1,则所有的匹配都会被替换。

例子:

1 <?php
2 $str = "The quick brown fox jumped over the lazy dog.";
3 $str = preg_replace('/\s/','-',$str);
4 echo $str;
5 ?>

输出结果:

The-quick-brown-fox-jumped-over-the-lazy-dog.

 例子2,使用数组:

 1 <?php
 2 $str = "The quick brown fox jumped over the lazy dog.";
 3 
 4 $patterns[0] = "/quick/";
 5 $patterns[1] = "/brown/";
 6 $patterns[2] = "/fox/";
 7 
 8 $replacements[2] = "bear";
 9 $replacements[1] = "black";
10 $replacements[0] = "slow";
11 
12 print preg_replace($patterns, $replacements, $str);
13 /*输出:
14 The bear black slow jumped over the lazy dog.
15 */
16 ksort($replacements);
17 print preg_replace($patterns, $replacements, $str);
18 /*输出:
19 The slow black bear jumped over the lazy dog.
20 */
21 ?>

例子 3 ,使用逆向引用:

1 <?php
2 $str = '<a href="http://www.5idev.com/">5idev</a>其他字符<a href="http://www.sohu.com/">sohu</a>';
3 $pattern = "/<a\s([\s\S]*?)>([\s\S]*?)<\/a>/i";
4 print preg_replace($pattern, '\\2', $str);
5 ?>

输出结果:

5idev其他字符sohu

preg_split()

preg_ split() 函数用于正则表达式分割字符串。

preg_split(  pattern,  subject [, int limit [, int flags]] )

pattern正则表达式
 subject 需要匹配分割的对象
 limit 可选,如果指定了 limit ,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flags
 flags

 设定 limit 为 -1 后可选,可以是下列标记的任意组合(用按位或运算符 | 组合):

1.PREG_SPLIT_NO_EMPTY:preg_split() 只返回非空的成分

2.PREG_SPLIT_DELIM_CAPTURE:定界符模式中的括号表达式也会被捕获并返回

3.PREG_SPLIT_OFFSET_CAPTURE:对每个出现的匹配结果也同时返回其附属的字符串偏移量。

注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。

 例子1:

<?php
$str = "php mysql,apache ajax";
$keywords = preg_split("/[\s,]+/", $str);
print_r($keywords);
?>

输出结果:

Array
(
    [0] => php
    [1] => mysql
    [2] => apache
    [3] => ajax
)

例子2:

<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

输出结果:

(
    [0] => s
    [1] => t
    [2] => r
    [3] => i
    [4] => n
    [5] => g
)

例子3:

<?php
$str = "php mysql,apache ajax";
$keywords = preg_split("/[\s,]+/", $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($keywords);
?

输出结果:

Array
(
    [0] => Array
        (
            [0] => php
            [1] => 0
        )
 
    [1] => Array
        (
            [0] => mysql
            [1] => 4
        )
 
    [2] => Array
        (
            [0] => apache
            [1] => 10
        )
 
    [3] => Array
        (
            [0] => ajax
            [1] => 17
        )
)

 ereg — 正则表达式匹配

 ereg匹配到%00自动停止

参考文章:http://www.5idev.com/p-php_regular_syntax_1.shtml

 

转载于:https://www.cnblogs.com/So7cool/p/9863298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值