PHP系统PHP正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘;

[email protected]

 

2(字符串匹配查找)

1)、字符串处理函数

2)、正则表达式函数

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

匹配查找: strops  strstr    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如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量. 注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第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

 


本文出自 “Linux狱长” 博客,请务必保留此出处http://sswqzx.blog.51cto.com/2494644/1966517

以上是关于PHP系统PHP正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

PHP正则表达式的快速学习方法

PHP 正则表达式函数

PHP正则表达式崩溃apache

PHP 正则表达式

PHP 正则表达式总结

php 正则表达式