设为首页 收藏本站
查看: 757|回复: 0

[经验分享] PHP系列(六)PHP正则表达式

[复制链接]

尚未签到

发表于 2018-12-13 08:51:27 | 显示全部楼层 |阅读模式
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]  -从哪到哪区间范围  ^除列表中
  元字符:不能在正则表达式中单独使用、修饰原子、是用来扩展原子功能和限定功能(写在定界符中)
  *  用来修饰其前面的原子可以出现0个1个或多个(任意次) {0,}
  +  用来修饰其前面的原子可以出现1次或多次、不能没有至少一次{1,}
  ?用来修饰其前面的原子可以出现0次或1次 {0,1}
  .  匹配任意单个字符
  {m}  用来修饰其前面原子只能出现m次
  {n,m} 用来修饰其前面原子只能出现n到m次
  {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'';
  print_r($arr);
  echo'';
  echo"完整的URL是 {$arr[0]} ";
  echo"协议是 {$arr[1]} ";
  echo"主机是 {$arr[2]} ";
  echo"域名是: {$arr[3]} ";
  echo"顶层域: {$arr[4]} ";
  echo"资源参数: {$arr[5]} ";
  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 '';
           print_r($arr);
           echo '';
           foreach($arr as $ar){
           echo "完整的URL {$ar[0]} ";
           echo "协议是 {$ar[1]} ";
           echo "主机是 {$ar[2]} ";
           echo "域名是: {$ar[3]} ";
           echo "顶层域: {$ar[4]} ";
           echo "资源参数: {$ar[5]} ";
           }
  }
  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)."";
  list($a,$b)=explode("__","wo__qu");
  echo $a."";
  echo $b."";
  显示为: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, '\1://$2.$3.$4', $str);
  echo $str."";
  echo $new."";
  晃示为:
  $str =  array(
           "如果没有一些http://www.baidu.com特殊的替换5求(比如正则表达式),你应http://www.lampbrother.net该使用该http://bbs.brophp.org函数替9 ereg_replace() 9 preg_replace() ",
           "如果没有一些http://www.baidu.com特殊的替换5求(比如正则表达式),你应http://www.lampbrother.net该使用该http://bbs.brophp.org函数替9 ereg_replace() 9 preg_replace() ",
           );
           $reg = array(
                              '/\/is',
                              '/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/e',
                              '/\d/'
                     );
           $rep = array(
                              '',
                              '"".strtoupper("$1://$2.$3.$4").""',
                              '@'
                     );
           $newstr = preg_replace($reg, $rep,$str);
           echo '';
           print_r($str)."";
           print_r($newstr)."";
           echo '';
  
  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
  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-650746-1-1.html 上篇帖子: vscode php插件以及终端快捷键 下篇帖子: php判断是手机登陆还是PC登陆
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表