preg和ereg的区别


题记:在PHP5.3里边ereg家族要被preg代替了。在这里列一下它们的区别。
名词解释:
  preg,代表“Perl的正则表达式(Perl Regular Expressions)”。
ereg,代表“扩展的正则表达式(Extended Regular Expressions)”。
区别:
  1.preg_replace()里面的正则可以写成型如:"/..../"而ereg_replace()里面的正则需写成型如".....";
  2.在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个
  3.preg_replace()能操作数组,而ereg_replace()不可以
  4.其他区别(下面4条)

其他区别:
  1.ereg里面是不需要也不能使用分隔符和修饰符的。
    例子:/hello.+?hello/is  说明:分隔符表达式修饰符

  2.'.'在正则里面一般是除了换行符以外的全部字符,但是在ereg里面的'.'是任意字符,即包括换行符!如果在preg里面希望'.'能够包括换行符,可以在修饰符中加上's'。
  3.ereg默认使用贪婪模式,并且不能修改。
    贪婪模式例子:要匹配以"a"开头"b"结尾的字符串,但是需要匹配的字符串是"abbbbbbbbbbbbbbbbb",如果你使用了贪婪模式,那么会匹配到最后一个"b",反之只是匹配到第一个"b"。
  4.preg的速度要远远比ereg快。

例子说明:
(注:以preg_replace()和ereg_replace()函数的使用为例)
1.进行字符串的查找的替换
A:PREG:
  $str  = "daoyu shi ge hao hai zi 5555";
  $pattern = "/\s/";   如果将变量定义为$pattern_1会出错
  $str  = preg_replace($pattern,'-',$str);
  echo $str."<br>";
  输出结果:daoyu-shi-ge-hao-hai-zi-5555
B:EREG:
  $str  = "daoyu shi ge hao hai zi 5555";
  $pattern= "[a-zA-Z]+";   如果写成$pattern= "/[a-zA-Z]+/"; 将不做任何替换也就是说这里不能用正则“/”(可能就是着两个函数的第一个区别 :))
  $str = ereg_replace($pattern,'~',$str);
  echo $str."<br>";
  输出结果:~ ~ ~ ~ ~ ~ 5555


2.对字符串的逆向引用
A:PREG:
方法一
  $pat  = "/(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\d+)/i";
  $str  =preg_replace($pat,"\$1",$str);
  echo $str."<br>";
  输出结果:daoyu
  注意:如果是下面这种形式你会发现匹配的是:zi- 所以可以这样认为在有次数的{6}的情况下,他($1)匹配的是最后一次
  $pat  = "/((\w+)-){6}(\d+)/i";
  $str  =preg_replace($pat,"\$1",$str);
  echo $str."<br>";
  输出结果:zi-
方法二
  $str  = "daoyu-shi-ge-hao-hai-zi-5555";
  $pat  = "/(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\d+)/i"; 
  $str  =preg_replace($pat,"\\1",$str);
  echo $str."<br>";
  输出结果:daoyu
  注意:当正则写成$pat= "/((\w+)-){6}(\d+)/i";时和上面的情况一样

B:EREG:
  在用下书册上的例子
  $string = "This is a test";
  echo ereg_replace("( )is", "\\1was", $string); “\\1”匹配”(空格)is“ 这部分的空格,换句话说就是”替换为数字表示的的第几个括号内的子串“

  echo ereg_replace("(( )is)", "\\2was", $string)."<br>";
  输出结果:This was a test


3 当参数是数组的情况(手册的例子)
A:PREG:
  $string = "The quick brown fox jumped over the lazy dog.";
  $patterns[0] = "/quick/";
  $patterns[1] = "/brown/";
  $patterns[2] = "/fox/";

  $replacements[2] = "bear";
  $replacements[1] = "black";
  $replacements[0] = "slow";

  print preg_replace($patterns, $replacements, $string)."<br>";
  输出结果:The bear black slow jumped over the lazy dog.

  或许你已经发现了,他是按“将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同”按我的理解就是在按“写”的顺序而这并不一定是索引的顺序(书册上还有还有ksort()后的例子,时间关系就不说了,有兴趣的兄弟可以自己找着看下)
B:EREG:
  不支持。

你可能感兴趣的:(PHP,正则表达式,String,perl,扩展)