多数大学生出来选择的工作和专业无关
首页 > 专业知识

php的正则处理函数小结

时间:2018-03-07 18:23:35 [来源]:郑州PHP培训学校

   php的正则处理函数小结

  array preg_grep ( string pattern, array input [, int flags] )
  preg_grep() 返回一个数组,其中包括了 input 数组中与给定的 pattern 模式相匹配的单元。
  flags 可以是以下标记:
  12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
  // 返回所有含有浮点数的数组元素。
  $fl_array = preg_grep ("/^(\d+)?\.\d+$/", $arr);
  print_r($fl_array);
  ?>
  preg_match
  (PHP 3 >= 3.0.9, PHP 4, PHP 5)
  preg_match -- 进行正则表达式匹配
  说明
  int preg_match ( string pattern, string subject [, array matches [, int flags]] )
  在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。
  如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
  flags 可以是下列标记:
  PREG_OFFSET_CAPTURE
  如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自 PHP 4.3.0 起可用。
  flags 参数自 PHP 4.3.0 起可用。
  preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。
  [url=mk:@MSITStore:C:\Documents%20and%20Settings\sun\桌面\参考手册\php_manual_zh.chm::/zh/function.preg-match-all.html]preg_match_all()[/url]
  则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。
  提示: 如果只想查看一个字符串是否包含在另一个字符串中,不要用 preg_match()。可以用
  [url=mk:@MSITStore:C:\Documents%20and%20Settings\sun\桌面\参考手册\php_manual_zh.chm::/zh/function.strpos.html]strpos()[/url]
  或
  [url=mk:@MSITStore:C:\Documents%20and%20Settings\sun\桌面\参考手册\php_manual_zh.chm::/zh/function.strstr.html]strstr()[/url]
  替代,要快得多。
  上面是手册里对preg_match()的说明,我认为这个函数的功用在于他可做来做验证,也就是某字符串是否符合某特定要求。其局限是上面所说的要么匹配0次,要么1次。并且返回值是匹配次数。当需要全匹配时可使用preg_match_all().另外值得一提的是$matches数组的作用,可做自模式的返回值,有时很有用。
  例:
  if (preg_match ("/(\bweb\b)\s(\d)/i", "PHP is the web 45 scripting web 34 language of choice.",$match)) {
  print "A match was found.";
  print_r($match);
  } else {
  print "A match was not found.";
  }
  ?>
  // 从 URL 中取得主机名
  preg_match("/^(http:\/\/)?([^\/]+)/i",
  "http://www.php.net/index.html", $matches);
  $host = $matches[2];
  // 从主机名中取得后面两段
  preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  echo "domain name is: {$matches[0]}\n";
  ?>
  preg_match_all
  (PHP 3 >= 3.0.9, PHP 4, PHP 5)
  preg_match_all -- 进行全局正则表达式匹配
  手册上该函数的解释非常明确,就不多做说明了。
  说明int preg_match_all ( string pattern, string subject, array matches [, int flags] )
  在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。
  搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。
  flags 可以是下列标记的组合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起来用没有意义):
  PREG_PATTERN_ORDER
  对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
  ("|]+>(.*)]+>|U",
  "example: this is a test",
  $out, PREG_PATTERN_ORDER);
  print $out[0][0].", ".$out[0][1]."\n";
  print $out[1][0].", ".$out[1][1]."\n";
  ?>
  本例将输出:
  example: , this is a test
  example: , this is a test
  因此,$out[0] 包含匹配整个模式的字符串,$out[1] 包含一对 HTML 标记之间的字符串。
  PREG_SET_ORDER
  对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。
  ("|]+>(.*)]+>|U",
  "example: this is a test",
  $out, PREG_SET_ORDER);
  print $out[0][0].", ".$out[0][1]."\n";
  print $out[1][0].", ".$out[1][1]."\n";
  ?>
  本例将输出:
  example: , example:
  this is a test, this is a test
  本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。
  PREG_OFFSET_CAPTURE
  如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
  如果没有给出标记,则假定为 PREG_PATTERN_ORDER。
  返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
  例子 1. 从某文本中取得所有的电话号码
  ("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
  "Call 555-1212 or 1-800-555-1212", $phones);
  ?>
  例子 2. 搜索匹配的 HTML 标记(greedy)
  // \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
  // 必须匹配正则表达式本身中第二组括号内的内容,本例中
  // 就是 ([\w]+)。因为字符串在双引号中,所以需要
  // 多加一个反斜线。
  $html = "bold textclick me";
  preg_match_all ("/(]*>)(.*)()/", $html, $matches);
  for ($i=0; $icount($matches[0]); $i++) {
  echo "matched: ".$matches[0][$i]."\n";
  echo "part 1: ".$matches[1][$i]."\n";
  echo "part 2: ".$matches[3][$i]."\n";
  echo "part 3: ".$matches[4][$i]."\n\n";
  }
  ?>
 
  接下来就是应用超灵活、、功能超强大、使用超广泛的preg_replace函数。
  preg_replace
  (PHP 3 >= 3.0.9, PHP 4, PHP 5)
  preg_replace -- 执行正则表达式的搜索和替换
  说明mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
  在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
  replacement 可以包含 \\n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 \\0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。
  对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 \\1 符号来表示逆向引用。举例说 \\11,将会使 preg_replace() 搞不清楚是想要一个 \\1 的逆向引用后面跟着一个数字 1 还是一个 \\11 的逆向引用。本例中的解决方法是使用 \${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。
  如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject。
  preg_replace() 的每个参数(除了 limit)都可以是一个数组。如果 pattern 和 replacement 都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用
  [url=mk:@MSITStore:C:\Documents%20and%20Settings\sun\桌面\参考手册\php_manual_zh.chm::/zh/function.ksort.html]ksort()[/url]
  对数组进行排序。
  如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。
  如果 pattern 和 replacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。
  /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
  注: limit 参数是 PHP 4.0.1pl2 之后加入的。
  我认为其强大之处就是他不但可以处理字符串,而且可以处理数组,并且他的逆向引用功能非常灵活。基本上他可以满足普通用户的大部分需求,如果他不能胜任,那么我们还有preg_replace_callback()函数,可以自定义回调函数,满足你的高级要求。如设计过滤器等。
  preg_replace_callback
  (PHP 4 >= 4.0.5, PHP 5)
  preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换
  说明mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
 

上一篇:php程序开发的字符串操作

下一篇:PHP实现文件上传的思路及实例