php正则表达式基本知识与应用详解【经典教程】(2)

修饰符 说明
i   忽略大小写  
m   多文本模式  
s   单行文本模式  
x   忽略空白字符  

正则表达式在php中应用

php中字符串匹配

所谓的字符串匹配,言外之意就是判断一个字符串中,是否包含或是等于另一个字符串。如果不使用正则,我们可以使用php中提供了很多方法进行这样的判断。

不使用正则匹配

strstr函数

string strstr ( string haystack,mixedneedle [, bool $before_needle = false ])

注1:haystack是当事字符串,needle是被查找的字符串。该函数区分大小写。

注2:返回值是从needle开始到最后。

注3:关于$needle,如果不是字符串,被当作整形来作为字符的序号来使用。

注4:before_needle若为true,则返回前东西。

stristr函数与strstr函数相同,只是它不区分大小写

strpo函数

int strpos ( string haystack,mixedneedle [, int $offset = 0 ] )

注1:可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。

stripos -查找字符串首次出现的位置(不区分大小定)
strrpos -计算指定字符串在目标字符串中最后一次出现的位置
strripos -计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

使用正则进行匹配

在php中,提供了preg_math()和preg_match_all函数进行正则匹配。关于这两个函数原型如下:

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

搜索subject与pattern给定的正则表达式的一个匹配.
pattern:要搜索的模式,字符串类型。
subject :输入字符串。
matches:如果提供了参数matches,它将被填充为搜索结果。 matches[0]将包含完整模式匹配到的文本,matches[1]将包含第一个捕获子组匹配到的文本,以此类推。
flags:flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
offset:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。
返回值:preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match()在第一次匹配后 将会停止搜索。 preg_match_all()不同于此,它会一直搜索subject直到到达结尾。 如果发生错误 preg_match()返回 FALSE。

实例

实例1

判断字符串”“中是否包含csdn?

解法一(不使用正则):

如果不适用正则,我们使用strstr或者strpos中任意一个都可以,在此,我将使用strstr函数,代码如下:

$str='http://blog.csdn.net/hsd2012'; function checkStr1($str,$str2) { return strstr1($str,$str2)?true:false; } echo checkStr($str,'csdn');

解法二:使用正则

因为我们只需要判断是否存在即可,所以选择preg_match。

$str='http://blog.csdn.net/hsd2012'; $pattern='/csdn/'; function checkStr2($str,$str2) { return preg_match($str2,$str)?true:false; } echo checkStr2($str,$pattern);

实例2(考察单词定界符

判断字符串”I am a good boy”中是否包含单词go

首先判断是单词,而不是字符串,因此比较的时候,需要比较是否包含' go ‘,即在字符串go前后有一个空格。

解析:如果使用非正则比较,只需要调用上面的checkStr1()函数即可,注意,第二个参数前后要加一个空格,即' go ‘。如果使用正则,

我们可以考虑使用单词定界符\b,那么$pattern='/\bgo\b/';然后调用checkStr2函数即可.

例3(考察反向引用)

判断字符串”I am a good boy”中是否包含3个相同的字母

解析:此时,如果我们不使用正则,将会很难判断,因为字母太多了,我们不可能去将所有字母分别与该字符串比较,那样工作量也比较大。这时候涉及到了正在的反向引用。在php正则表达式中,通过\n,来表示第n次匹配到的结果。如\5代表第五次匹配到的结果。那么本题的$pattern='/(\w).*\1.*\1/';

主要注意的是,在使用反向匹配的时候都需要使用(),反向匹配时,匹配()里面出现的字符或字符串。

php中字符串替换

不使用正则

php中当替换字符串的时候,如果不适用正则,我们通常使用substr、mb_substr、str_replace、substr_replace关于这几个函数区别如下表。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/97d84dbcf3db0911be810efa059cd787.html