正则表达式单行、多行模式简介知识介绍
正则表达式单行、多行模式简介知识介绍
单行、多行模式容易出现理解错误
为什么说,容易出现理解错误呢,它们英文对应说明是:SingleLine ,MultiLine,刚好是单行、多行意思。因此,很多朋友就会从字面理解里面,得出以下结论:(哈哈、刚刚使用,我也是这些朋友中一员)
1、单行,就是从头到尾匹配,多行就是如果匹配字符串,里面有换行符,就匹配到之前
2、单行跟多行是冲突的,一次只能指定一个选项,不能同时使用
这样来理解其实,很容易就会这样的。我们来看看,官方手册里面怎么说的。
单行、多行模式官方解释
| 模式符 | 描述 |
|---|---|
| s(单行) | 如果设置了这个修饰符, 模式中的点号元字符匹配所有字符, 包含换行符. 如果没有这个 修饰符, 点号不匹配换行符 |
| m(多行) | 目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符(^)仅匹配字符串的开始位置, 而”行末”元字符($)仅匹配字符串末尾。当这个修饰符设置之后, “行首”和”行末”就会匹配目标字符串中任意换行符(\n)之前或之后 |
举例,看单行应用
<?php
///读取hao123.com首页
///并且去掉里面script代码
/**
*去掉script标签*
* @author chengmo
* @copyright http://blog.chacuo.net/
* @param string $content 原字符串
* @param int $style 匹配模式
* @return string
*/
function remove_script($content,$style=1)
{
$reg = $style == 1?"%<script.*?>.*?</script>%":"%<script.*?>.*?</script>%s";
return preg_replace($reg,"",$content);
}
$content = file_get_contents('http://www.hao123.com');
echo remove_script($content);
举例,看多行应用
<?php
///读取hao123.com首页
///读取meta标签内容
/**
*读取meta标签内容*
* @author chengmo
* @copyright http://blog.chacuo.net/
* @param string $content 原字符串
* @param int $style 匹配模式
* @return string
*/
function read_meta($content,$style=1)
{
$reg = $style == 1?"%^<meta.*?/>%":"%^<meta.*?>\s+$%m";
preg_match_all($reg,$content,$arr);
return $arr;
}
$content = file_get_contents('http://www.hao123.com');
var_dump(read_meta($content));
后记:s,m 修饰符只对,几个特殊元字符有改变。如果你正则表达式中没有那几个元字符。开启s,m字符前后将没有什么变化的。对于上面读取hao123.com代码,我们可以继续同时使用s,m模式。如:”%<script.*?>.*?(^currentProfile.*$).*?</script>%sm” ,匹配所有script标签,并且里面js代码,有一行以curentProfile开头字符串。(以下是正则表达式,单行多行一起使用)