正则表达式

1.基础知识:

正则表达式是一种描述文本所包含模式的方法。

使用PCRE正则表达式,每个表达式必须包含在一对分隔符中。你可以选择任何非字 母、数字、“\”或空格的字符作为分隔符。字符串的开始和结束必须有匹配的分隔符。

2.分隔符

最常用的分隔符是“/”。

匹配“shop”的正则表达式:/shop/

如果要在正则表达式中匹配字符“/”,需要使用来转义“/”:/shop\//

如果模式包含了多个分隔符,需要考虑选择不同的分隔符。我们可以用#作为分割符

在结束分割符后添加一个模式修饰符:/shop/i

2.字符类和类型

/ .at/:可以匹配“cat” “sat”和“mat”等字符串

要限定第一个字母是a到z之间的字符:/[a-z]at/

要限定第一个字母是 abc:/[abc]at/

/ [a-zA-Z] /:任何大小写字母

可以用来匹配任何不在a和z之间的字符:/a-z;()

表4-5用于PCRE风格正则表达式的字符类

匹配匹配
[[:alnum:]]文字数字字符[[:punct:]]标点符号
[[:alpha:]]字母字符[[:blank:]]制表符和空格
[[:asci:]]ASCII字符[[lower:]]小写字母
[[:space:]]空白字符[[:upper:]]大写字母
[[:cntrl:]]控制符[[:digit:]]小数
[[:print:]]所有可打印的字符[[:xdigit:]]十六进制数字
[[:graph:]]除空格外所有可打印的字符[[:word::]]“word”字符(字母、数字或下划线)

3.重复

在正则表达式中,你可以使用三个特殊字符代替。符号*表示这个模式可以重复出 现0次或多次,符号“+”则表示这个模式可以重复出现1次或多次。“?”表示这个模式 可以出现1次或0次。

/[[:alnum:]]+/:最少出现一次

4.子表达式

/(very )*large/

你可以用在花括号({})中使用数字表达式来指定内容允许重复的次数。可以指定一个 确切的重复次数(例如,{3}表示重复3次),或者一个重复次数的范围({2, 4}表示重复 2〜4次),或是未指定最大范围的重复模式({2, }表示至少要重复两次)。

/(very ){1,3}/:very可以出现1到3次

5.定位:

……用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始 处,&字符用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾。

在字符串开始处匹配bob:/^bob/

匹配以com为结束的字符串:/com$/

6.分支

你可以在正则表达式中使用来表示模式选择。例如,如果要匹配com、edu或 net,就可以使用如下所示的表达式:

/com|edu|net/

 

在PHP中,必须使用单引号来引用正则表达式模式。使用双引号引用的正则表达式将 带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符。如果希望在模式中匹配一 个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。

7.元字符

表4・6在PCRE正则表达式中,用于方括号外面的特殊字符   
字符意义字符意义
\转意字符)子模式的结束
^在字符串开始匹配*重复0次或更多次
$在字符串末尾匹配+重复一次或更多次
.匹配除换行符(\n)之外的字符{最小/最大虽汜号的开始
|选择分支的开始(读为或))最小/最大量记号的结束
(子模式的开始?标记一个子模式为可选的

 

 

表4-7在PCRE正则表达式中,用于方括号里面的特殊字符

字 符意 义
\转意字符
^非,仅用在开始位置
_用于指定字符范围

 

8.转义序列

表4・8 PCRE正则表达式的特殊字符类型

字符类型含 义字符类型含 义
\d十进制数字\S任意非空白字符
\D任意非十进制数字\v垂直空白字符
\h水平空白字符W任意非垂直空白字符
\H任意非水平空白字符\w单词字符
\s空白字符\W任意非单词字符

9.回溯引用(\1)

10.在[]内‘-’代表特殊意义,所以要用(-)而【】外用(.)

11.用正则表达式查找子字符串

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索 subject 与 pattern 给定的正则表达式的一个匹配。

参数说明:

  • $pattern: 要搜索的模式,字符串形式。

  • $subject: 输入字符串。

  • $matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

  • $flags:flags 可以被设置为以下标记值:

    1. PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。

  • offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。

返回值

返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。preg_match_all() 不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

<?php
$string = "aasassdASD.";
if(preg_match('/^a(as){1,3}[a-zA-Z]+\.$/',$string))
{
    echo "正确";
}
else
{
    echo "错误";
}

12.用正则表达式替换子字符串

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

参数说明:

  • $pattern: 要搜索的模式,可以是字符串或一个字符串数组。

  • $replacement: 用于替换的字符串或字符串数组。

  • $subject: 要搜索替换的目标字符串或字符串数组。

  • $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。

  • $count: 可选,为替换执行的次数。

返回值

如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。

如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。

<?php
//删除空格
$string = 'google 123, 456';
$string = preg_replace('/\s+/','',$string);
echo $string;

13.用正则表达式分割子字符串

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

通过一个正则表达式分隔给定字符串。

参数说明:

  • $pattern: 用于搜索的模式,字符串形式。

  • $subject: 输入字符串。

  • $limit: 可选,如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制", 作为php的标准,你可以使用null跳过对flags的设置。

  • $flags: 可选,可以是任何下面标记的组合(以位或运算 | 组合):

    • PREG_SPLIT_NO_EMPTY: 如果这个标记被设置, preg_split() 将进返回分隔后的非空部分。

    • PREG_SPLIT_DELIM_CAPTURE: 如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。

    • PREG_SPLIT_OFFSET_CAPTURE: 如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量. 注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第1个元素为该子串在subject 中的偏移量组成的数组。

返回值

返回一个使用 pattern 边界分隔 subject 后得到的子串组成的数组。

//获取搜索字符串的部分
<?php
//使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
?>

 

//将一个字符串分隔为组成它的字符
<?php
$str = 'runoob';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

 

//分隔一个字符串并获取每部分的偏移量
<?php
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值