威尼斯手机平台登陆-官方网站登录

威尼斯手机平台登陆为您带来世界三大博彩公司最新相关资讯,威尼斯官方网站登录充分考虑到不同地域网民的不同需求,威尼斯手机平台登陆良好的用户界面,人性化的操作,实用的功能设计使其广泛受到欢迎,推动实体出版、影视、动漫、游戏等相关文化产业的发展。

您的位置:威尼斯手机平台登陆 > 威尼斯登录首页 > 使用PCRE库的效率略占优势,函数原型

使用PCRE库的效率略占优势,函数原型

发布时间:2020-04-21 16:52编辑:威尼斯登录首页浏览(121)

    今天在使用split时遇到一些问题。还是对函数理解不深刻,特写出来做个记号

    PHP函数split()的基本语法为:array split ( string $pattern, string $string [, int $limit] )。我们向大家举了两个例子来具体讲解这个函数的使用方法。对于初学者来说,掌握PHP中常用函数的用法,是其继续学习的基础。今天我们就为大家详细介绍有关PHP函数split()的一些使用方法,希望大家能通过这篇文章介绍的内容增加自己的知识库。说明array split ( string $pattern, string $string [, int $limit] )提示preg_split() 函数使用了 Perl 兼容正则表达式语法,通常是比PHP函数split()更快的替代方案。如果不需要正则表达式的威力,则使用 explode() 更快,这样就不会招致正则表达式引擎的浪费。本函数返回一个字符串数组,每个单元为 string 经区分大小写的正则表达式 pattern 作为边界分割出的子串。如果设定了 limit,则返回的数组最多包含 limit 个单元,而其中最后一个单元包含了 string 中剩余的所有部分。如果出错,则 split() 返回 FALSE。将 /etc/passwd 中的前四个字段分割出来:例 1839. PHP函数split()例子深入PHP nl2br()格式化输出的详解复制代码 代码如下: 如果字符串中有 n 个与 pattern 匹配的项目,则返回的数组将包含 n+1 个单元。例如,如果没有找到 pattern,则会返回一个只有一个单元的数组。当然,如果 string 为空也是这样。解析可能用斜线,点,或横线分割的日期:例 1840. PHP函数split()例子复制代码 代码如下:注意 pattern 是一个正则表达式。如果想要用的分割字符是正则表达式中的特殊字符,要先将其转义。如果觉得PHP函数split行为古怪的话,请阅读包含在 PHP 发行包中 regex/ 子目录下的 regex.7 文件。该文件是手册页面格式,可以用类似 man /usr/local/src/regex/regex.7 的命令来阅读

    在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation System interface)扩展库提供的。POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数。 
    两套函数库的功能相似,执行效率稍有不同。一般而言,实现相同的功能,使用PCRE库的效率略占优势。下面详细介绍其使用方法。 

    首先来看下两个方法的定义:

    正则表达式的匹配 
    1.preg_match() 
    函数原型:int preg_match (string $pattern, string $content [, array $matches]) 
    preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其 中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只 作一次匹配,最终返回0或1的匹配结果数。代码6.1给出preg_match()函数的一段代码示例。 

    函数原型:array split (string $pattern, string $string [, int $limit])

    日期时间的匹配,代码如下:

    函数原型:array explode ( string $separator, string $string [, int $limit])

    <?php   //需要匹配的字符串。date函数返回当前时间   $content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together.";   //使用通常的方法匹配时间   if (preg_match ("/d{4}-d{2}-d{2} d{2}:d{2} [ap]m/", $content, $m))   {   echo "匹配的时间是:" .$m[0]. "n";   }   //由于时间的模式明显,也可以简单的匹配   if (preg_match ("/([d-]{10}) ([d:]{5} [ap]m)/", $content, $m))   {   echo "当前日期是:" .$m[1]. "n";   echo "当前时间是:" .$m[2]. "n";   }   ?> 
    

    初看没有啥差别,貌似功能都一样。我就犯了这个错误。 请注意两个函数的第一个参数string $pattern和string separator,一个是$pattern说明是正则字符串,一个是$separator是普通字符串。

    这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。 
    匹配的时间是:2006-08-17 01:25 pm 
    当前日期是:2006-08-17 
    当前时间是:01:25 pm

    看下面的代码:

    2.ereg()和eregi() 

    $test = end(explode('.', 'abc.txt')); 
    echo $test;//output txt
    

    ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版 本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则 表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。 

    换成:

    文件名的安全检验 代码如下:

    $test1 = end(split('.','abc.txt')); 
    echo $test1;//no output
    
    <?php   $username = $_SERVER['REMOTE_USER'];   $filename = $_GET['file'];   //对文件名进行过滤,以保证系统安全   if (!ereg('^[^./][^/]*$', $userfile))   {   die('这不是一个非法的文件名!');   }   //对用户名进行过滤   if (!ereg('^[^./][^/]*$', $username))   {   die('这不是一个无效的用户名');   }   //通过安全过滤,拼合文件路径   $thefile = "/home/$username/$filename";   ?> 
    

    用split的正确做法是:加转义符号

    通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数。 

    $test1 = end(split('.','abc.txt')); 
    echo $test1;//output txt
    

    3.preg_grep() 
    函数原型:array preg_grep (string $pattern, array $input) 
    preg_grep()函数返回一个数组,其中包括了$input数组中与给定的$pattern模式相匹配的单元。对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。代码6.3给出的示例简单地说明了preg_grep()函数的使用。 
    数组查询匹配  代码如下:

    分析:”.” 符号是正则表达式的关键字所以split无效,而explode有效。

    <?php   $subjects = array(   "Mechanical Engineering", "Medicine",   "Social Science", "Agriculture",   "Commercial Science", "Politics"   );   //匹配所有仅由有一个单词组成的科目名   $alonewords = preg_grep("/^[a-z]*$/i", $subjects);   ?> 
    

     

    进行全局正则表达式匹配 
    1.preg_match_all() 
    与preg_match()函数类似。如果使用了第三个参数,将把所有可能的匹配结果放入。本函数返回整个模 式匹配的次数(可能为0),如果出错返回False。下面是一个将文本中的URL链接地址转换为HTML代码的示例。代码6.4是 preg_match_all()函数的使用范例。 
    将文本中的链接地址转成HTML 代码如下:

    <?php   //功能:将文本中的链接地址转成HTML   //输入:字符串   //输出:字符串   function url2html($text)   {   //匹配一个URL,直到出现空白为止   preg_match_all("/http://?[^s]+/i", $text, $links);   //设置页面显示URL地址的长度   $max_size = 40;   foreach($links[0] as $link_url)   {   //计算URL的长度。如果超过$max_size的设置,则缩短。   $len = strlen($link_url);   if($len > $max_size)   {   $link_text = substr($link_url, 0, $max_size)."...";   } else {   $link_text = $link_url;   }   //生成HTML文字   $text = str_replace($link_url,"<a  color: #800080;">$link_url'>$link_text</a>",$text);   }   return $text;   }   //运行实例   $str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.jb51.net”;   print url2html($str);   /*输出结果   这是一个包含多个URL链接地址的多行文字。欢迎访问<a  >   http://www.jb51.net</a>   */   ?> 
    

     

    2.多行匹配 
    仅仅使用POSIX下的正则表式函数,很难进行复杂的匹配操作。例如,对整个文件(尤其是多行文本)进行匹配查找。使用ereg()对此进行操作的一个方法是分行处理。代码演示了ereg()如何将INI文件的参数赋值到数组之中。 
    文件内容的多行匹配 代码如下:

    <?php   $rows = file('php.ini'); //将php.ini文件读到数组中   //循环遍历   foreach($rows as $line)   {   If(trim($line))   {   //将匹配成功的参数写入数组中   if(eregi("^([a-z0-9_.]*) *=(.*)", $line, $matches))   {   $options[$matches[1]] = trim($matches[2]);   }   unset($matches);   }   }   //输出参数结果   print_r($options);   ?> 
    

     

    提示 这里只是为了方便说明问题。解析一个*.ini文件,最佳方法是使用函数parse_ini_file()。该函数直接将*.ini文件解析到一个大数组中。 

    正则表达式的替换 
    1.ereg_replace()和eregi_replace() 
    函数原型:

    string ereg_replace (string $pattern, string $replacement, string $string)   string eregi_replace (string $pattern, string $replacement, string $string) 
    

    ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换 为$replacement。当$pattern中包含模式单元(或子模式)时,$replacement中形如“威尼斯登录首页,1”或“$1”的位置将依次被这些子 模式所匹配的内容替换。而“”或“$0”是指整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“\0”,“ \1”的形式。 

    eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小写。代码6.6是本函数的应用实例,这段代码演示了如何对程序源代码做简单的清理工作。 
    源代码的清理 代码如下:

    <?php   $lines = file('source.php'); //将文件读入数组中   for($i=0; $i<count($lines); $i++)   {   //将行末以“\”或“#”开头的注释去掉   $lines[$i] = eregi_replace("(//|#).*$", "", $lines[$i]);   //将行末的空白消除   $lines[$i] = eregi_replace("[ nrtvf]*$", "rn", $lines[$i]);   }   //整理后输出到页面   echo htmlspecialchars(join("",$lines));   ?> 
    

     

    2.preg_replace() 
    函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit]) 
    preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。 
    数组替换 代码如下:

    <?php   //字符串   $string = "Name: {Name}<br>nEmail: {Email}<br>nAddress: {Address}<br>n";   //模式   $patterns =array(   "/{Address}/",   "/{Name}/",   "/{Email}/"   );   //替换字串   $replacements = array (   "No.5, Wilson St., New York, U.S.A",   "Thomas Ching",   "tom@emailaddress.com",   );   //输出模式替换结果   print preg_replace($patterns, $replacements, $string);   ?> 
    

    输出结果如下。 
    Name: Thomas Ching", 
    Email: tom@emailaddress.com 
    Address: No.5, Wilson St., New York, U.S.A 
    在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如: 

    代码如下:

    <?php   $html_body = “<HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”;   //输出结果中HTML标签将全部为小写字母   echo preg_replace (   "/(</?)(w+)([^>]*>)/e",   "'\1'.strtolower('\2').'\3'", //此处的模式变量\2将被strtolower转换为小写字符   $html_body);   ?> 
    

    提示 preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。 

     正则表达式的拆分 
    1.split()和spliti() 
    函数原型:array split (string $pattern, string $string [, int $limit]) 
    本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如 果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。代码6.8是一个经常用到关于日期的示例。 
    日期的拆分 代码如下:

    <?php   $date = "08/30/2006";   //分隔符可以是斜线,点,或横线   list($month, $day, $year) = split ('[/.-]', $date);   //输出为另一种时间格式   echo "Month: $month; Day: $day; Year: $year<br />n";   ?> 
    

    2.preg_split() 
    本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。 
    查找文章中单词数量 代码如下:

    <?php   $seek = array();   $text = "I have a dream that one day I can make it. So just do it, nothing is impossible!";   //将字符串按空白,标点符号拆分(每个标点后也可能跟有空格)   $words = preg_split("/[.,;!s']s*/", $text);   foreach($words as $val)   {   $seek[strtolower($val)] ++;   }   echo "共有大约" .count($words). "个单词。";   echo "其中共有" .$seek['i']. "个单词“I”。";   ?> 
    

    提示 preg_split() 函数使用了Perl兼容正则表达式语法,通常是比split()更快的替代方案。使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面 对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。

    转自 


    本文由威尼斯手机平台登陆发布于威尼斯登录首页,转载请注明出处:使用PCRE库的效率略占优势,函数原型

    关键词: