首页 >函数列表 >preg_replace_callback

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 = -1 [, int &$count ]] )

这个函数的行为除了 可以指定一个callback替代replacement进行替换 字符串的计算, 其他方面等同于preg_replace()

参数

pattern

要搜索的模式, 可以使字符串或一个字符串数组.

callback

一个回调函数, 在每次需要替换时调用, 调用时函数得到的参数是从subject 中匹配到的结果. 回调函数返回真正参与替换的字符串.

你可能经常会需要callback函数而 仅用于preg_replace_callback()一个地方的调用. 在这种情况下, 你可以 使用匿名函数来定义一个匿名函数作 为preg_replace_callback()调用时的回调. 这样做你可以保留所有 调用信息在同一个位置并且不会因为一个不在任何其他地方使用的回调函数名称而污染函数名称空间.

Example #1 preg_replace_callback()create_function()

<?php

$fp fopen("php://stdin""r") or die("can't read stdin");
while (!
feof($fp)) {
    
$line fgets($fp);
    
$line preg_replace_callback(
        
'|<p>s*w|',
        
create_function(
            
// single quotes are essential here,
            // or alternative escape all $ as $
            
'$matches',
            
'return strtolower($matches[0]);'
        
),
        
$line
    
);
    echo 
$line;
}
fclose($fp);
?>

subject

要搜索替换的目标字符串或字符串数组.

limit

对于每个模式用于每个subject字符串的最大可替换次数. 默认是-1(无限制).

count

如果指定, 这个变量将被填充为替换执行的次数.

返回值

如果subject是一个数组, preg_replace_callback()返回一个数组, 其他情况返回字符串. 错误发生时返回NULL.

如果查找到了匹配, 返回替换后的 目标字符串(或字符串数组), 其他情况subject 将会无变化返回.

更新日志

版本 说明
5.1.0 增加了参数count.

范例

Example #2 preg_replace_callback()示例

<?php
// 将文本中的年份增加一年.
$text "April fools day is 04/01/2002 ";
$text.= "Last christmas was 12/24/2001 ";
// 回调函数
function next_year($matches)
{
  
// 通常: $matches[0]是完成的匹配
  // $matches[1]是第一个捕获子组的匹配
  // 以此类推
  
return $matches[1].($matches[2]+1);
}
echo 
preg_replace_callback(
            
"|(d{2}/d{2}/)(d{4})|",
            
"next_year",
            
$text);

?>

以上例程会输出:

April fools day is 04/01/2003
Last christmas was 12/24/2002

Example #3 preg_replace_callback()使用递归构造处理BB码的封装

<?php
$input 
"plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function 
parseTagsRecursive($input)
{
    

    
while (false !== ($file readdir($handle))) {
        echo 
"$file ";
    }

    

    
while ($file readdir($handle)) {
        echo 
"$file ";
    }

    
closedir($handle);
}
?>

Example #2 列出当前目录的所有文件并去掉 ...

<?php
if ($handle opendir('.')) {
    while (
false !== ($file readdir($handle))) {
        if (
$file != "." && $file != "..") {
            echo 
"$file ";
        }
    }
    
closedir($handle);
}
?>

参见

  • is_dir() - 判断给定文件名是否是一个目录
  • glob() - 寻找与模式匹配的文件路径

  • chdir
  • chroot
  • closedir
  • getcwd
  • opendir
  • readdir
  • rewinddir
  • scandir
  • PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道