开发者社区> 科技小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP系列(六)PHP正则表达式

简介:
+关注继续查看

php正则表达式

        正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式,如JavaScriptjava等。其实,只有了解一种语言的正则使用,其他语言的正则使用起来,就相对简单些。文本主要围绕解决下面问题展开。

匹配查找分割替换

1、正规表达语法

定界符号:多种都可以%%||、常用//

 

原子:最少的一个匹配单位位(放在定界符中)、在一个正则表达式中、至少有一个原子

原子是正则表达式的最基本的组成单元、而且在每个模式中最少要包含一个原子、原子是由所有那些未指定为元字符的打印和非打印字符组成、具体分为5类。

1)、普通字符作为原子:如、a-z  A-Z  0-9

 

2)、一些特殊字符和转义后元字符作为原子:所有标点符号、但语句特殊意义的符号要转

义后才可作为原子、如:\”\’\*\+\?\. 

 

3)、一些非打印字符作为原子、如:\f\n\r\t\v\cx

\f 换页符  

\n 换行符 

\r回车符 

\t制表符

\v垂直制表符

\cx匹配由x指明的控制字符

4)、使用通用字符类型作为原子、如:\d\D\w\W\s\S

\d 代表任意一个数字  [0-9]

\D 代表任意一个非数字 [^0-9]

\w 代表任意一个字 a-z  A-Z 0-9 _  [a-zA-Z_]

\W 代表任意一个非字 除了a-z  A-Z 0-9 _之外的所有字符[^a-zA-Z_]

\s 代表空白 [\t\n\f\v]

\S 代表非空白 [^\t\n\f\v]

 

5)、自定义原子表([])作为原子、如:’/[apj]sp/’

[a-zA-Z]  -从哪到哪区间范围  ^除列表中

 

元字符:不能在正则表达式中单独使用、修饰原子、是用来扩展原子功能和限定功能(写在定界符中)

*  用来修饰其前面的原子可以出现01个或多个(任意次) {0,}

+  用来修饰其前面的原子可以出现1次或多次、不能没有至少一次{1,}

?用来修饰其前面的原子可以出现0次或1 {0,1}

.  匹配任意单个字符

{m}  用来修饰其前面原子只能出现m

{n,m} 用来修饰其前面原子只能出现nm

{n,} 用来修饰其前面原子最少出现n

^\A 匹配输入字符串开始位置

$\Z 匹配输入字符串结束位置

\b  匹配单词的边界

\B  匹配除单词边界以外的部分

() 匹配其整体为一个原子、即模式单元、可以理解为多个单元组成的大单元。

改变优先级别

将小原子就成大原子

子模式、整个表达式是一个大的模式、小括号中是每个独立的子模式反向引用

 

模式修正符号:修正、对模式(正则)修正(写在定界符号外面、写在右边)

符号:i : 忽略大小写

            m: 视为多行、在使用^$这二个符号时、每一行满足都可以(默认视为一行处理)

             s:修正正则表达式中的 . 可以匹配换行符号、(默认不能匹配回车符号)

             x:修正正则表达式、可以省略空白

                   U:取消贪婪模式 等价于(.*?)

 

正则表达式编补写

网址正则:

$reg = '/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/';

http://www.lampbrother.net/php/demo.inc.php?username=admin&p=123456

邮箱正则:

$reg ='/\w+([+-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i';

mei+zi+zi+zi+zi@lampbrother.net

 

2(字符串匹配查找)

1)、字符串处理函数

2)、正则表达式函数

注意:如果可以直接使用字符串处理函数处理的字符串、就不要用正则

匹配查找: strops  strstr(string,search) substr(string,start,length)

正则匹配查找preg_match()  preg_match_all()   preg_grep()

 

Strpos(string, find,start) 查找字符串在另一字符串中第一次出现的位置、区分大小写、返回数字(stripos不区分大小写)

String:必需。规定要搜索的字符串。

Find:  必需。规定要查找的字符串。

Start: 可选。规定在何处开始搜索。

 

Preg_match(pattern ,string, array)执行一个正则表达式匹配、返回一个数组

Pattern 要搜索的模式,字符串类型、正则。

Subject 输入字符

Array 返回的数组

$reg='/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/';

if(preg_match($reg, $_POST['url'], $arr)) {

         echo'<pre>';

         print_r($arr);

         echo'</pre>';

         echo"完整的URL {$arr[0]} <br>";

         echo"协议是 {$arr[1]} <br>";

         echo"主机是 {$arr[2]} <br>";

         echo"域名是: {$arr[3]} <br>";

         echo"顶层域: {$arr[4]} <br>";

         echo"资源参数: {$arr[5]} <br>";

 

preg_match_all(pattern ,string, array,[flags])执行一个全局正则表达式匹配、返回数组

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

string输入字符串。

array多维数组,作为输出参数输出所有匹配结果数组排序通过flags指定。

flags可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER PREG_SET_ORDER

         $p = "我是http://www.qq.com/ss/dad/a.php,

         我们不是你的站http://www.bitedy.com/ad/c/dd/admin.php";

if(preg_match_all('/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/',$p, $arr,PREG_SET_ORDER)) {

         echo '<pre>';

         print_r($arr);

         echo '</pre>';

         foreach($arr as $ar){

         echo "完整的URL {$ar[0]} <br>";

         echo "协议是 {$ar[1]} <br>";

         echo "主机是 {$ar[2]} <br>";

         echo "域名是: {$ar[3]} <br>";

         echo "顶层域: {$ar[4]} <br>";

         echo "资源参数: {$ar[5]} <br>";

         }

}

 

Preg_grep(paten, array)返回匹配模式的数组条目

pattern要搜索的模式字符串形式.

input输入数组.

flags如果设置为PREG_GREP_INVERT, 这个函数返回输入数组中与 给定模式pattern不匹配的元素组成的数组.

 

$arr = array(“aa  b”, “cc”, ”a c”, ”dd”);

$content = preg_grep(‘/\s/’, $arr);

Print_r($content);

 

3、字符串分割

字符串分割:explode()    implode()--join()

正则表达式分割:preg_split()

Explode(separator,string,limit)把字符串打散为数组

Separator separator字符做为分隔符

String 要分割的字符串

Limit可选。规定所返回的数组元素的数目。

可能的值:

大于 0 - 返回包含最多 limit 个元素的数组

小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组

0 - 返回包含一个元素的数组

$str = "L-a-m-p";

print_r(explode("-", $str, 3));

显示为:Array ( [0] => L [1] => a [2] =>m-p )

 

preg_split (pattern, string,limit,flags) 通过一个正则表达式分隔字符串、返回数组

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

subject输入字符串

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

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

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

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

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

 

Implode(string, array) 将一个一维数组的值转化为字符串

String string字符连接数组元素

Array 想要转换的数组

 

$str = "L-a-m-p";

//print_r(explode("-", $str, 3));

$s=preg_split('/\W/', $str,-1,PREG_SPLIT_NO_EMPTY);

echo implode("++",$s)."<br>";

list($a,$b)=explode("__","wo__qu");

echo $a."<br>";

echo $b."<br>";

显示为:L++a++m++p  wo  qu

 

4、字符串替换函数

字符串处理:str_replace()

正则表达式:preg_replace()

Str_replace(search,replace, subject, count)查找search替换为replace、字符串替换

Search:查找的目标值,也就是 needle。一个数组可以指定多个目标。

Replacesearch 的替换值。一个数组可以被用来指定多重替换。

Subject:执行替换的数组或者字符串。也就是 haystack

如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。

Count:如果被指定,它的值将被设置为替换发生的次数。

 

$arr = "我是中国人、你是哪国人、中国房产";

$num = 0;

$new = str_replace(array("","中国", "房产"), array("我们","美国","高科技"), $arr, $num);

echo $new;

显示为:我们是美国人、你是哪国人、美国高科技

 

Preg_replace(pattern,replacement, subject, limit, count) 查找符合pattern正则替换为replacement、正则字符串替换

Pattern 要搜索的模式、可以是一个正则

Replacement将要替换的字符串或字符串数组

subject替换后的字符串或字符串数组

limit每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)

count如果指定,将会被填充为完成的替换次数

$str = "如晨光http://www.baidu.com特别人的http://www.bitedy.com/ad/index.php";

$url='/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/';

$new = preg_replace($url, '<ahref="\1://\2.\3.\4">\1://$2.$3.$4</a>', $str);

echo $str."<br>";

echo $new."<br>";

晃示为:

$str =  array(

         "如果没有一些http://www.baidu.com特殊的<b>替换</b>5求(<u>比如正则表达式</u>),你应http://www.lampbrother.net该使用该http://bbs.brophp.org函数替9 <font color='red'>ereg_replace()</font> 9 preg_replace() ",

         "如果没有一些http://www.baidu.com特殊的<b>替换</b>5求(<u>比如正则表达式</u>),你应http://www.lampbrother.net该使用该http://bbs.brophp.org函数替9 <font color='red'>ereg_replace()</font> 9 preg_replace() ",

         );

         $reg = array(

                            '/\<[\/\!]*?[^\<\>]+?\>/is',

                            '/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/e',

                            '/\d/'

                   );

         $rep = array(

                            '',

                            '"<ahref=\'$1://$2.$3.$4\'>".strtoupper("$1://$2.$3.$4")."</a>"',

                            '@'

                   );

         $newstr = preg_replace($reg, $rep,$str);

         echo '<pre>';

         print_r($str)."<br>";

         print_r($newstr)."<br>";

         echo '</pre>';

 

preg_quote(string)转义正则表达式字符、正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : preg_replace_callback (pattern, callback, subject,[limit[,count]])执行一个正则表达式搜索并且使用一个回调进行替换

pattern要搜索的模式,可以使字符串或一个字符串数组。

Callback 一个回调函数

subject 要搜索替换的目标字符串或字符串数组

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

Count  如果指定,这个变量将被填充为替换执行的次数。

$text = "今天是2016-04-05、明年是2017";

$reg ="/(\d{4})-(\d{2}-\d{2})/";

function fun($m){

         return ($m[1]+1).$m[2];

}

echopreg_replace_callback($reg, "fun", $text);

显示为:今天是201704-05、明年是2017

 


本文转自 sswqzx 51CTO博客,原文链接:http://blog.51cto.com/sswqzx/1966517

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP面试题:你常用到的mysql命令?
PHP面试题:你常用到的mysql命令?
57 0
PHP连接MySQL 8.0报错的解决办法
PHP连接MySQL 8.0报错的解决办法
149 0
UIWebView体系结构(六)UIWebView
UIWebView的实际成员变量都由UIWebViewInternal保存,UIWebViewInternal的声明如下: @interface UIWebViewInternal : NSObject { UIScrollView...
1000 0
23704
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载