ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4693|回复: 10

[细说PHP] 第12章正则表达式

[复制链接]
发表于 2013-8-7 14:58:07 | 显示全部楼层 |阅读模式
函数preg_match()

<?php
        $pattern = '/<a.*?(?: |\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\n)+.*?)?>(.+?)<\/a.*?>/sim';
        $content = "请进单击进入<a href='http://www.lampbrother.net'>LAMP兄弟连</a>技术社区。";
       
        //使用preg_match()函数进行正则表达式的模式匹配
        if(preg_match($pattern, $content)) {    
                echo "成功匹配,在第二个参数中包含有效的HTML链接标签字符串。";
        } else {
                echo "在第二个参数的字符串中搜索不到有效的HTML链接标签。";
        }        

回复

使用道具 举报

 楼主| 发表于 2013-8-7 15:08:14 | 显示全部楼层
preg_match()函数,第三个参数的应用

<?php
        //一个用于匹配URL的正则表达式
        $pattern = '/(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/i';
        //被搜索字符串
        $subject = "网址为http://www.lampbrother.net/index.php的位置是LAMP兄弟连";       
       
        //使用preg_match()函数进行匹配
        if(preg_match($pattern, $subject, $matches)) {              
                echo "搜索到的URL为:".$matches[0]."<br>";        //数组中第一个元素保存全部匹配结果
                echo "URL中的协议为:".$matches[1]."<br>";        //数组中第二个元素保存第一个子表达式
                echo "URL中的主机为:".$matches[2]."<br>";        //数组中第三个元素保存第二个子表达式
                echo "URL中的域名为:".$matches[3]."<br>";        //数组中第四个元素保存第三个子表达式
                echo "URL中的顶域为:".$matches[4]."<br>";        //数组中第五个元素保存第四个子表达式
                echo "URL中的文件为:".$matches[5]."<br>";        //数组中第六个元素保存第五个子表达式
        } else {
                echo "搜索失败!";                                                     //如果和正则表达式没有匹配成功则输出
        }        
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 15:27:14 | 显示全部楼层

函数preg_match_all()

<?php
        //声明一个可以匹配URL的正则表达式
        $pattern = '/(https?|ftps?):\/\/(www|bbs)\.([^\.\/]+)\.(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/i';  
       
        //声明一个包含多个URL链接地址的多行文字
        $subject = "网址为http://bbs.lampbrother.net/index.php的位置是LAMP兄弟连,
                    网址为http://www.baidu.com/index.php的位置是百度,
                    网址为http://www.google.com/index.php的位置是谷歌。";

        $i = 1;                               //定义一个计数器,用来统计搜索到的结果数
       
        //搜索全部的结果
        if(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {  
                //循环遍历二维数组$matches
                foreach($matches as $urls) {
                        echo "搜索到第".$i."个URL为:".$urls[0]."<br>";   
                        echo "第".$i."个URL中的协议为:".$urls[1]."<br>";   
                        echo "第".$i."个URL中的主机为:".$urls[2]."<br>";   
                        echo "第".$i."个URL中的域名为:".$urls[3]."<br>";  
                        echo "第".$i."个URL中的顶域为:".$urls[4]."<br>";   
                        echo "第".$i."个URL中的文件为:".$urls[5]."<br>";  
               
                        $i++;                         //计数器累加
                }       
        } else {
                echo "搜索失败!";
        }


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 15:35:12 | 显示全部楼层
函数preg_grep()

<?php
        $array = array("Linux RedHat9.0", "Apache2.2.9", "MySQL5.0.51", "PHP5.2.6", "LAMP", "100");
       
        //返回数组中以字母开始和以数字结束,并且没有空格的单元,赋给变量$version
        $version = preg_grep("/^[a-zA-Z]+(\d|\.)+$/", $array);  
       
        print_r($version);      
       
        //输出:Array ( [1] => Apache2.2.9 [2] => MySQL5.0.51 [3] => PHP5.2.6 )
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 15:37:44 | 显示全部楼层
字符串处理函数

<?php
        echo strstr("this is a test!", "test");          //输出test!
       
        echo strstr("this is a test!", 115);            //搜索 "s" 的ASCII值所代表的字符输出s is a test!       
?>


<?php
        /**
                用于获取URL中的文件名部分
                @param        string        $url         任何一个URL格式的字符串
                @return        string                 URL中的文件名称部分
        */
        function getFileName($url) {
             //获取URL字符串中最后一个“/”出现的位置,再加1则为文件名开始的位置
                $location = strrpos($url, "/")+1;
                //获取在URL中从$location位置取到结尾的子字符串
                $fileName = substr($url, $location);        
                //返回获取到的文件名称
                return $fileName;                      
        }

        //获取网页文件名index.php
        echo getFileName("http://bbs.lampbrother.net/index.php");           
        //获取网页中图片名logo.gif       
        echo getFileName("http://bbs.lampbrother.com/images/Sharp/logo.gif");
        //获取本地中的文件名php.ini
        echo getFileName("file:///C:/WINDOWS/php.ini");                        
?>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 15:53:55 | 显示全部楼层
函数preg_replace()

<?php
        //可以匹配所有HTML标记的开始和结束的正则表达式
        $pattern = "/<[\/\!]*?[^<>]*?>/is";                     
        
        //声明一个带有多个HTML标记的文本
        $text = "这个文本中有<b>粗体</b>和<u>带有下画线</u>以及<i>斜体</i>
                     还有<font color='red' size='7'>带有颜色和字体大小</font>的标记";                 

        //将所有HTML标记替换为空,即删除所有HTML标记
        echo preg_replace($pattern, "", $text);                  
        
        //通过第四个参数传入数字2,替换前两个HTML标记
        echo preg_replace($pattern, "", $text, 2);           
?>

<?php
        //日期格式的正则表达式
        $pattern = "/(\d{2})\/(\d{2})\/(\d{4})/";         
        
        //带有两个日期格式的字符串
        $text="今年国庆节放假日期为10/01/2012到10/07/2012共7天。";
        
        //将日期替换为以“-”分隔的格式
        echo preg_replace($pattern, "\\3-\\1-\\2", $text);   

        //将“\\1”改为“\${1}”的形式
        echo preg_replace($pattern, "\${3}-\${1}-\${2}",$text);     
?>

<?php
        //可以匹配所有HTML标记的开始和结束的正则表达式
        $pattern = "/(<\/?)(\w+)([^>]*>)/e";
         
        //声明一个带有多个HTML标记的文本
        $text = "这个文本中有<b>粗体</b>和<u>带有下画线</u>以及<i>斜体</i>还
                     有<font color='red' size='7'>带有颜色和字体大小</font>的标记";   
       
        //将所有HTML的小写标记替换为大写                 
        echo preg_replace($pattern, "'\\1'.strtoupper('\\2').'\\3'", $text);
?>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 16:07:10 | 显示全部楼层
论坛UBB代码转换

源码详见书本P307
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 16:16:10 | 显示全部楼层
函数str_replace()和函数str_ireplace()

<?php
    //声明包含多个“LAMP”字符串的文本,也包含小写的“lamp”字符串
        $str="LAMP是目前最流行的WEB开发平台;<br>
              LAMP为B/S架构软件开发的黄金组合;<br>
              LAMP每个成员都是开源软件;<br>
              lampBrother是LAMP的技术社区。<br>";
     
    //区分大小写的将“LAMP”替换为“Linux+Apache+MySQL+PHP”,并统计替换次数
        echo str_replace("LAMP", "Linux+Apache+MySQL+PHP",$str, $count);
        echo "区分大小写时共替换".$count."次<br>";          //替换4次
     
    //不区分大小写的将“LAMP”替换为“Linux+Apache+MySQL+PHP”,并统计替换次数
        echo str_ireplace("LAMP", "Linux+Apache+MySQL+PHP", $str,$count);
        echo "不区分大小写时共替换".$count."次<br>";    //替换5次
?>

<?php
        //元音字符数组
        $vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");         
        
        //将第三个参数中的字符串,搜索到的数组中的元素值都被替换为空,区分大写小替换
        echo str_replace($vowels, "", "Hello World of PHP");  //输出: Hll Wrld f PHP
        
        //元音字符数组
        $vowels = array("a", "e", "i", "o", "u");                                    

        //将第三个参数中的字符串,搜索到的数组中的元素值都被替换为空,不区分大写小替换
        echo str_ireplace($vowels, "", "HELLO WORLD OF PHP"); //输出:HLL WRLD F PHP
?>

<?php
        $search = array("http","www", "jsp", "com");        //搜索目标数组
        $replace = array("ftp", "bbs", "php", "net");          //替换数组

        $url="http://www.jspborther.com/index.jsp";                //被替换的字符串

        echo str_replace($search, $replace, $url);          //输出替换后的结果:ftp://bbs.phpborther.net/index.php
?>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 16:21:16 | 显示全部楼层
函数preg_split()

<?php
    //按任意数量的空格和逗号分隔字符串,其中包含" ", \r, \t, \n and \f
        $keywords = preg_split ("/[\s,]+/", "hypertext language, programming");
        print_r($keywords);         //分割后输出Array ( [0] => hypertext [1] => language [2] => programming )
       
    //将字符串分割成字符
        $chars = preg_split('//', "lamp", -1, PREG_SPLIT_NO_EMPTY);
        print_r($chars);            //分割后输出Array ( [0] => l [1] => a [2] => m [3] => p )
       
        //将字符串分割为匹配项及其偏移量
        $chars = preg_split('/ /','hypertext language programming', -1, PREG_SPLIT_OFFSET_CAPTURE);
        print_r($chars);   
       
        /* 分割后输出:
                Array ( [0] => Array ( [0] => hypertext [1] => 0 )
                    [1] => Array ( [0] => language [1] => 10 )
                           [2] => Array ( [0] => programming [1] => 19 ) )  
        */

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 16:22:44 | 显示全部楼层
函数explode()

<?php
        $lamp = "Linux Apache MySQL PHP";        //声明一个字符串$lamp,每个单词之间使用空格分割
        $lampbrother = explode(" ", $lamp); //将字符串$lamp使用空格分割,并组成数组返回
        echo $lampbrother[2];                    //输出数组中第三个元素,即$lamp中的第三个子串MySQL
        echo $lampbrother[3];                   //输出数组中第三个元素,即$lamp中的第四个子串PHP

        //将Linux中的用户文件的一行提出
        $password = "redhat:*:500:508::/home/redhat:/bin/bash";   
        //按“:”分割7个子串
        list($user, $pass, $uid, $gid, , $home, $shell) = explode(":", $password);  
        echo $user;                                               //1.提出用户名保存在变量$user中,输出redhat
        echo $pass;                                              //2.提出密码位字符保存在变量$pass中,输出*
        echo $uid;                                                //3.提出用户名ID保存在变量$uid中,输出500
        echo $gid;                                               //4.提出用户名组ID保存在变量$gid中,输出508
        echo $home;                                              //5.提出家目录保存在变量$home中,输出/home/redhat
        echo $shell;                                              //6.提出用户使用的shell保存在变量$shell中,输出/bin/bash
       
        //声明字符串$lamp,每个单词之间使用加号“+”分割
        $lamp = "Linux+Apache+MySQL+PHP";  
        //使用正数限制子串个数,而最后那个元素将包含 $lamp中 的剩余部分
        print_r(explode('+', $lamp, 2));  //输出Array ( [0] => Linux [1] => Apache+MySQL+PHP )
        //使用负数限制子串,则返回除了最后的限制个元素外的所有元素
        print_r(explode('+', $lamp, -1));  //输出Array ( [0] => Linux [1] => Apache [2] => MySQL )
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 23:30 , Processed in 0.040919 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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