php引用函数的使用方法有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php引用函数的使用方法有哪些?相关的知识,希望对你有一定的参考价值。

参考技术A

  在技术学习的道路上,能掌握一些有用的技巧,对于初学者是非常有帮助的,下面是php引用函数的使用方法,希望大家会喜欢。

   1.不要在你的应用程序中gzip输出,让apache来做

  考虑使用ob_gzhandler?不,别这样做。它没有任何意义。PHP应该是来写应用程序的。不要担心PHP中有关如何优化在服务器和浏览器之间传输的数据。

  使用apache mod_gzip/mod_deflate通过.htaccess文件压缩内容。

   2.从php echo javascript代码时使用json_encode

  有些时候一些javascript代码是从php动态生成的。

  $images = array( 'myself.png' , 'friends.png' , 'colleagues.png');

  $js_code = '';foreach($images as $image)

  

  $js_code .= "'$image' ,";

  

  $js_code = 'var images = [' . $js_code . ']; ';echo $js_code;//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];

  放聪明点。使用json_encode:

  $images = array( 'myself.png' , 'friends.png' , 'colleagues.png');

  $js_code = 'var images = ' . json_encode($images);

  echo $js_code;//Output is : var images = ["myself.png","friends.png","colleagues.png"]

  这不是很整洁?

   3.在写入任何文件之前检查目录是否可写

  在写入或保存任何文件之前,请务必要检查该目录是否是可写的,如果不可写的话,会闪烁错误消息。这将节省你大量的“调试”时间。当你工作于Linux时,权限是必须要处理的,并且会有很多很多的权限问题时,当目录不可写,文件无法读取等的时候。

  请确保你的应用程序尽可能智能化,并在最短的时间内报告最重要的信息。

  $contents = "All the content";

  $file_path = "/var/www/project/content.txt";

  file_put_contents($file_path , $contents);

  这完全正确。但有一些间接的问题。file_put_contents可能会因为一些原因而失败:

  父目录不存在

  目录存在,但不可写

  锁定文件用于写入?

  因此,在写入文件之前最好能够一切都弄明确。

  $contents = "All the content";

  $dir = '/var/www/project';

  $file_path = $dir . "/content.txt";if(is_writable($dir))

  

  file_put_contents($file_path , $contents);

  else    die("Directory $dir is not writable, or does not exist. Please check");

  

  通过这样做,你就能得到哪里文件写入失败以及为什么失败的准确信息。

   4.改变应用程序创建的文件的权限

  当在Linux环境下工作时,权限处理会浪费你很多时间。因此,只要你的php应用程序创建了一些文件,那就应该修改它们的权限以确保它们在外面“平易近人”。否则,例如,文件是由“php”用户创建的,而你作为一个不同的用户,系统就不会让你访问或打开文件,然后你必须努力获得root权限,更改文件权限等等。

  // Read and write for owner, read for everybody elsechmod("/somedir/somefile", 0644);// Everything for owner, read and execute for otherschmod("/somedir/somefile", 0755);

   5.不要检查提交按钮值来检查表单提交

  if($_POST['submit'] == 'Save')

      //Save the things

  以上代码在大多数时候是正确的,除了应用程序使用多语言的情况。然后“Save”可以是很多不同的东西。那么你该如何再做比较?所以不能依靠提交按钮的值。相反,使用这个:

  if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )

      //Save the things

  现在你就可以摆脱提交按钮的值了。

   6.在函数中总是有相同值的地方使用静态变量

  //Delay for some timefunction delay()

  $sync_delay = get_option('sync_delay');    echo "

  Delaying for $sync_delay seconds...";

  sleep($sync_delay);    echo "Done

  ";

  

  相反,使用静态变量:

  //Delay for some timefunction delay()    static $sync_delay = null;    if($sync_delay == null)

  

  $sync_delay = get_option('sync_delay');

      echo "

  Delaying for $sync_delay seconds...";

  sleep($sync_delay);    echo "Done

  ";

  

   7.不要直接使用$ _SESSION变量

  一些简单的例子是:

  $_SESSION['username'] = $username;

  $username = $_SESSION['username'];

  但是这有一个问题。如果你正在相同域中运行多个应用程序,会话变量会发生冲突。2个不同的应用程序在会话变量中可能会设置相同的键名。举个例子,一个相同域的前端门户和后台管理应用程序。

  因此,用包装函数使用应用程序特定键:

  define('APP_ID' , 'abc_corp_ecommerce');//Function to get a session variablefunction session_get($key)

  $k = APP_ID . '.' . $key;    if(isset($_SESSION[$k]))

          return $_SESSION[$k];

      return false;

  //Function set the session variablefunction session_set($key , $value)

  $k = APP_ID . '.' . $key;

  $_SESSION[$k] = $value;    return true;

  

   8.封装实用辅助函数到一个类中

  所以,你必须在一个文件中有很多实用函数:

  function utility_a()    //This function does a utility thing like string processingfunction utility_b()    //This function does nother utility thing like database processingfunction utility_c()    //This function is ...

  自由地在应用程序中使用函数。那么你或许想要将它们包装成一个类作为静态函数:

  class Utility    public static function utility_a()

  

      public static function utility_b()

  

      public static function utility_c()

  

  

  //and call them as $a = Utility::utility_a();

  $b = Utility::utility_b();

  这里你可以得到的一个明显好处是,如果php有相似名称的内置函数,那么名称不会发生冲突。

  从另一个角度看,你可以在相同的应用程序中保持多个版本的相同类,而不会发生任何冲突。因为它被封装了,就是这样。

   9.一些傻瓜式技巧

  使用echo代替print

  使用str_replace代替preg_replace,除非你确定需要它

  不要使用short tags

  对于简单的字符串使用单引号代替双引号

  在header重定向之后要记得做一个exit

  千万不要把函数调用放到for循环控制行中。

  isset比strlen快

  正确和一致地格式化你的\'代码

  不要丢失循环或if-else块的括号。

  不要写这样的代码:

  if($a == true) $a_count++;

  这绝对是一种浪费。

  这样写

  if($a == true)

  

  $a_count++;

  

  不要通过吃掉语法缩短你的代码。而是要让你的逻辑更简短。使用具有代码高亮功能的文本编辑器。代码高亮有助于减少错误。

   10. 使用array_map快速处理数组

  比方说,你要trim一个数组的所有元素。新手会这样做:

  foreach($arr as $c => $v)

  

  $arr[$c] = trim($v);

  

  但它可以使用array_map变得更整洁:

  $arr = array_map('trim' , $arr);

  这适用于trim数组$arr的所有元素。另一个类似的函数是array_walk。

   11.使用php过滤器验证数据

  你是不是使用正则表达式来验证如电子邮件,IP地址等值?是的,每个人都是这样做的。现在,让我们试试一个不同的东西,那就是过滤器。

  php过滤器扩展程序将提供简单的方法来有效验证或校验值。

   12.强制类型检查

  $amount = intval( $_GET['amount'] );

  $rate = (int) $_GET['rate'];

  这是一种好习惯。

   13.使用set_error_handler()将Php错误写入到文件

  set_error_handler()可以用来设置自定义的错误处理程序。在文件中编写一些重要的错误用于日志是个好主意。

   14.小心处理大型数组

  大型的数组或字符串,如果一个变量保存了一些规模非常大的东西,那么要小心处理。常见错误是创建副本,然后耗尽内存,并得到内存溢出的致命错误:

  $db_records_in_array_format; //This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100 = 2MB$cc = $db_records_in_array_format; //2MB moresome_function($cc); //Another 2MB ?

  当导入csv文件或导出表到csv文件时,上面这样的代码很常见。

  像上面这样做可能经常会由于内存限制而让脚本崩溃。对于小规模的变量它不会出现问题,但当处理大型数组时一定要对此加以避免。

  考虑通过引用传递它们,或者将它们存储在一个类变量中:

  $a = get_large_array();

  pass_to_function(&$a);

  这样一来,相同的变量(并非其副本)将用于该函数。

  class A    function first()

          $this->a = get_large_array();        $this->pass_to_function();

      function pass_to_function()

          //process $this->a

  

  

  尽快复原它们,这样内存就能被释放,并且脚本的其余部分就能放松。

  下面是关于如何通过引用来赋值从而节省内存的一个简单示例。

  <?phpini_set('display_errors' , true);

  error_reporting(E_ALL);

  $a = array();for($i = 0; $i < 100000 ; $i++)

  

  $a[$i] = 'A'.$i;

  echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '

  ';

  $b = $a;

  $b[0] = 'B';echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '

  ';

  $c = $a;

  $c[0] = 'B';echo 'Memory usage in MB after 2st copy : '. memory_get_usage() / 1000000 . '

  ';

  $d =& $a;

  $d[0] = 'B';echo 'Memory usage in MB after 3st copy (reference) : '. memory_get_usage() / 1000000 . '

  ';

  一个典型php 5.4机器上的输出是:

  Memory usage in MB : 18.08208Memory usage in MB after 1st copy : 27.930944Memory usage in MB after 2st copy : 37.779808Memory usage in MB after 3st copy (reference) : 37.779864

  因此可以看出,内存被保存在第3份通过引用的副本中。否则,在所有普通副本中内存将被越来越多地使用。

   15.在整个脚本中使用单一的数据库连接

  请确保你在整个脚本使用单一的数据库连接。从一开始就打开连接,使用至结束,并在结束时关闭它。不要像这样在函数内打开连接:

  function add_to_cart()

  $db = new Database();

  $db->query("INSERT INTO cart .....");

  function empty_cart()

  $db = new Database();

  $db->query("DELETE FROM cart .....");

  

  有多个连接也不好,会因为每个连接都需要时间来创建和使用更多的内存,而导致执行减缓。

  在特殊情况下。例如数据库连接,可以使用单例模式。

php中正则表达式详解

概述

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

  • 有哪些常用的转义字符
  • 什么是限定符与定位符
  • 什么是单词定位符
  • 特殊字符有哪些
  • 什么是逆向引用以及怎样使用逆向引用
  • 匹配模式
  • php中怎样使用正则表达式
  • php中哪些方面需要用到正则
  • 怎样进行邮箱匹配,url匹配,手机匹配
  • 怎样使用正则替换字符串中某些字符
  • 贪婪匹配与惰性匹配区别
  • 正则表达式之回溯与固态分组
  • 正则优缺点有哪些

正则表达式的基本知识汇总

行定位符(^与$)

行定位符是用来描述字符串的边界。“$”表示行结尾“^”表示行开始如"^de",表示以de开头的字符串 "de$",表示以de结尾的字符串。

单词定界符

我们在查找的一个单词的时候,如an是否在一个字符串”gril and body”中存在,很明显如果匹配的话,an肯定是可以匹配字符串“gril and body”匹配到,怎样才能让其匹配单词,而不是单词的一部分呢?这时候,我们可以是哟个单词定界符。 
an 去匹配”gril and body”的话,就会提示匹配不到。 
当然还有一个大写的B,它的意思,和正好相反,它匹配的字符串不能使一个完整的单词,而是其他单词或字符串中的一部分。如BanB。

选择字符(|) ,表示或

选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。

排除字符,排除操作

正则表达式提供了”^”来表示排除不符合的字符,^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。

限定符(?*+{n,m})

限定符主要是用来限定每个字符串出现的次数。

限定字符含义
零次或一次
* 零次或多次
+ 一次或多次
{n} n次
{n,} 至少n次
{n,m} n到m次

如(D+)表示一个或多个D

点号操作符

匹配任意一个字符(不包含换行符)

表达式中的反斜杠()

表达式中的反斜杠有多重意义,如转义、指定预定义的字符集、定义断言、显示不打印的字符。

转义字符

转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有”.”,”?”、””等。

指定预定义的字符集

字符含义
d 任意一个十进制数字[0-9]
D 任意一个非十进制数字
s 任意一个空白字符(空格、换行符、换页符、回车符、字表符)
S 任意一个非空白字符
w 任意一个单词字符
W 任意个非单词字符

###显示不可打印的字符

字符含义
a 报警
 退格
f 换页
换行
回车
字表符

括号字符()

在正则表达式中小括号的作用主要有:

  • 改变限定符如(|、* 、^)的作用范围 
    如(my|your)baby,如果没有”()”,|将匹配的是要么是my,要么是yourbaby,有了小括号,匹配的就是mybaby或yourbaby。
  • 进行分组,便于反向引用

反向引用

反向引用,就是依靠子表达式的”记忆”功能,匹配连续出现的字串或是字符。如(dqs)(pps)12,表示匹配字符串dqsppsdqspps。在下面php应用中,我将详细展开学习反向引用。

模式修饰符

模式修饰符的作用是设定模式,也就是正则表达式如何解释。php中主要模式如下表:

修饰符说明
i 忽略大小写
m 多文本模式
s 单行文本模式
x 忽略空白字符

正则表达式在php中应用

php中字符串匹配

所谓的字符串匹配,言外之意就是判断一个字符串中,是否包含或是等于另一个字符串。如果不使用正则,我们可以使用php中提供了很多方法进行这样的判断。

不使用正则匹配

  • strstr函数 
    string strstr ( string haystack,mixedneedle [, bool $before_needle = false ]) 
    • 注1:haystack,needle是被查找的字符串。该函数区分大小写。
    • 注2:返回值是从needle开始到最后。
    • 注3:关于$needle,如果不是字符串,被当作整形来作为字符的序号来使用。
    • 注4:before_needle若为true,则返回前东西。
  • stristr函数与strstr函数相同,只是它不区分大小写
  • strpo函数 
    int strpos ( string haystack,mixedneedle [, int $offset = 0 ] ) 
    注1:可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。
  • stripos -查找字符串首次出现的位置(不区分大小定)
  • strrpos -计算指定字符串在目标字符串中最后一次出现的位置
  • strripos -计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写

使用正则进行匹配

在php中,提供了preg_math()和preg_match_all函数进行正则匹配。关于这两个函数原型如下:


int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索subject与pattern给定的正则表达式的一个匹配. 
pattern:要搜索的模式,字符串类型。 
subject :输入字符串。 
matches:如果提供了参数matches,它将被填充为搜索结果。 matches[0],matches[1]将包含第一个捕获子组匹配到的文本,以此类推。 
flags:flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。 
offset:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。 
返回值:preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match()在第一次匹配后 将会停止搜索。 preg_match_all()不同于此,它会一直搜索subject直到到达结尾。 如果发生错误 preg_match()返回 FALSE。

实例

  • 实例1 
    判断字符串”http://blog.csdn.net/hsd2012“中是否包含csdn? 
    解法一(不适用正则): 
    如果不适用正则,我们使用strstr或者strpos中任意一个都可以,在此,我将使用strstr函数,代码如下:
$str=‘http://blog.csdn.net/hsd2012‘;
function checkStr1($str,$str2)
{
    return strstr1($str,$str2)?true:false;
}
echo checkStr($str,‘csdn‘);

解法二:使用正则 
因为我们只需要判断是否存在即可,所以选择preg_match。

$str=‘http://blog.csdn.net/hsd2012‘;
$pattern=‘/csdn/‘;
function checkStr2($str,$str2)
{
    return preg_match($str2,$str)?true:false;
}
echo checkStr2($str,$pattern);
  • 实例2(考察单词定界符) 
    判断字符串”I am a good boy”中是否包含单词go 
    首先判断是单词,而不是字符串,因此比较的时候,需要比较是否包含’ go ‘,即在字符串go前后有一个空格。 
    解析:如果使用非正则比较,只需要调用上面的checkStr1()函数即可,注意,第二个参数前后要加一个空格,即’ go ‘。如果使用正则, 
    我们可以考虑使用单词定界符,那么$pattern=’/go/’;然后调用checkStr2函数即可.
  • 例3(考察反向引用
    判断字符串”I am a good boy”中是否包含3个相同的字母 
    解析:此时,如果我们不使用正则,将会很难判断,因为字母太多了,我们不可能去将所有字母分别与该字符串比较,那样工作量也比较大。这时候涉及到了正在的反向引用。在php正则表达式中,通过 ,来表示第n次匹配到的结果。如5代表第五次匹配到的结果。那么本题的$pattern=‘/(w).*1.*1/‘; 
    主要注意的是,在使用反向匹配的时候都需要使用(),反向匹配时,匹配()里面出现的字符或字符串。

php中字符串替换

不使用正则

php中当替换字符串的时候,如果不适用正则,我们通常使用substr、mb_substr、str_replace、substr_replace关于这几个函数区别如下表。

函数符功能描述
str_replace(find,replace,string,count) 使用一个字符串替换字符串中的另一些字符。 find 必需。规定要查找的值。replace 必需。规定替换 find 中的值的值。string 必需。规定被搜索的字符串。count 可选。一个变量,对替换数进行计数。
substr_replace(string,replacement,start,length) 把字符串的一部分替换为另一个字符串。适合用于替换自定位置的字符串。 string 必需。规定要检查的字符串。replacement 必需。规定要插入的字符串。start 必需。规定在字符串的何处开始替换。

使用正则

如果使用正则替换,php中提供了preg_replace _callback和preg_replace 函数,preg_replace 原型如下: 
mixed preg_replace ( mixed pattern,mixedreplacement , mixed subject[,intlimit = -1 [, int &count]])串subject中,查找pattern,使用replacement 去替换,如果有limitlimitpregreplacecallbackpregreplacepregreplaceback使callbackreplacement.?1hello,hello;:str=’hello,中国’; 
str=strreplace(hello,,str) 
或是使用str=substrreplace(str,’你好’,0,5) 
使用正则 
pattern=/hello/;str=preg_replace (pattern,,str); 
- 例2 
去除字符串”gawwenngeeojjgegop”中连续相同的字母

$str=‘gawwenngeeojjgegop‘;
$pattern=‘/(.)1/‘;
$str=preg_replace($pattern,‘‘,$str);

解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味’gewwenngeeojjgegop’,针对这中问题,当然,这样的话,通过判断,继续替换下去。

  • 例3 
    将字符串中”age13gegep3iorji65k65k”;中出现的连续两个数字改为第二个数字,如字符串中13被改为3
$str=‘age13gegep3iorji65k65k‘;
$pattern=‘/(d)(d)/‘;
$str=preg_replace($pattern,‘$2‘, $str);

解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。

php中字符串分割

不适用正则

php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下: 
array explode ( string delimiter,stringstring [, int $limit ] ) 
delimiter:边界上的分隔字符。 
string:输入的字符串。 
limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。

使用正则

关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。 
array preg_split ( string pattern,stringsubject [, int limit=?1[,intflags = 0 ]] )

$str=‘http://blog.csdn.net/hsd2012/article/details/51152810‘;
$str=explode(‘/‘, $str);

解法二:

$str=‘http://blog.csdn.net/hsd2012/article/details/51152810‘;
$pattern=‘///‘;  /*因为/为特殊字符,需要转移*/
$str=preg_split ($pattern, $str);

php中贪婪匹配与惰性匹配

  • 贪婪匹配:就是匹配尽可能多的字符。 
    比如,正则表达式中m.*n,它将匹配最长以m开始,n结尾的字符串。如果用它来搜索manmpndegenc的话,它将匹配到的字符串是manmpndegen而非man。可以这样想,当匹配到m的时候,它将从后面往前匹配字符n。
  • 懒惰匹配:就是匹配尽可能少的字符。 
    有的时候,我们需要并不是去贪婪匹配,而是尽可能少的去匹配。这时候,就需要将其转为惰性匹配。怎样将一个贪婪匹配转为惰性匹配呢?只需要在其后面添加一个”?”即可。如m.*?n将匹配manmpndegenc,匹配到的字符串是man。
函数符描述
*? 零次或多次,但尽可能少的匹配
+? 一次或多次,但尽可能少的匹配
?? 0次或1次,但尽可能少的匹配
{n,}? 至少n次,但尽可能少的匹配
{n,m}? n到m次 ,但尽可能少的匹配

php正则表达式之回溯与固态分组

回溯

首先我们需要清楚什么是回溯,回溯就像是在走岔路口,当遇到岔路的时候就先在每个路口做一个标记。如果走了死路,就可以照原路返回,直到遇见之前所做过的标记,标记着还未尝试过的道路。如果那条路也走不能,可以继续返回,找到下一个标记,如此重复,直到找到出路,或者直到完成所有没有尝试过的路。首先我们看例题

$str=‘aageacwgewcaw‘;
$pattern=‘/aw*c/i‘;
$str=preg_match($pattern, $str);

看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢?

匹配过程接下来操作描述
‘aw*c’中a匹配到’aageacwgewcaw’中第一个字符a w进行下一个字符匹配
因为w是贪婪匹配,会一直匹配到’aageacwgewcaw’中最后一个字符w c进行下一个字符匹配时
‘aw*c’中c发现没有可以匹配的 于是w匹配进行第一次回溯,匹配到倒数第二个字符a
‘aw*c’中c发现还是没有可以匹配的 于是w匹配进行第二次回溯,匹配到倒数第三个字符c
‘aw*c’中c匹配成功 匹配结束返回结果

现在,如果我们将pattern为pattern=’/aw*?c/i’;又会回溯多少次呢?正确答案是回溯四次。

固态分组

固态分组,目的就是减少回溯次数, 使用(?>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘w+:’这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合w的字符,假如字符串的末尾没有’:’,即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的w+释放字符,并且在交还的字符中重新尝试与’:’作比对。但是问题出现在这里: w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。 
如下代码,就不会进行回溯:

$str=‘nihaoaheloo‘;
$pattern=‘/(?>w+):/‘;
$rs=preg_match($pattern, $str);

当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果

$str=‘nihaoahelaa‘;
$pattern1=‘/(?>w+)a/‘;
$pattern2=‘/w+a/‘;
$rs=preg_match($pattern1, $str);//0
$rs=preg_match($pattern2, $str);//1

php中其他常用字符串操作函数

  • 字符串截取截取 
    string substr ( string string,intstart [, int length])stringmbsubstr(stringstr , int start[,intlength = NULL [, string $encoding = mb_internal_encoding() ]] )
  • 字符串中大小写转换 
    strtoupper 
    strtolower 
    ucfirst 
    ucwords
  • 字符串比较 
    -strcmp、strcasecmp、strnatcmp
  • 字符串过滤
  • 字符串翻转 
    strrev($str);
  • 字符串随机排序 
    string str_shuffle ( string $str )

补充

怎样进行邮箱匹配,url匹配,手机匹配

使用preg_match函数进行匹配,以下内容从TP中复制而来。 
邮箱验证 
pattern=/w+([?+.]w+)?@w+([?.]w+)?.w+([?.]w+)?/’; 
url匹配 
pattern=‘/^http(s?)://(?:[A-za-z0-9-]+.)+[A-za-z]{2,4}(:d+)?(?:[/?#][/=?%-&~`@[]‘:+!.#w]*)?/’; 
手机验证 
pattern=/1[3458]d10/’;

php中正则的优缺点

php中正则在某些时候,能帮我们解决php函数很多困难的匹配或是替换。然后php中正则的效率,往往是我们需要考虑的,所以在某些时候,能不用正则还是尽量不去用它,除非,某些场合必须用到,或是我们能够有效减少其回溯次数。


























































以上是关于php引用函数的使用方法有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

基本概念之将引用作为函数的参数有哪些特点?

Java 引用外部 jar后, 如何使用 jar中的 类, 函数。如何知道jar里都有哪些 方法。 谢谢!

php mysqli 常用函数都有哪些

php数组函数有哪些操作?php数组函数的应用

PHP引用(&)使用详解

php中请求url都有哪些方法