更改preg_replace_callback中的替换值

时间:2011-09-06 07:03:42

标签: php regex preg-replace preg-replace-callback

function replaceContent($matches = array()){
    if ($matches[1] == "nlist"){
        // do stuff
        return "replace value";
    } elseif ($matches[1] == "alist"){
        // do stuff
        return "replace value";
    }

    return false;
} 

preg_replace_callback('/<([n|a]list)\b[^>]*>(.*?)<\/[n|a]list>/','replaceContent', $page_content);
如果找到匹配项,则replaceContent()中的

$ matches返回此数组:

Array
(
    [0] => <nlist>#NEWSLIST#</nlist>
    [1] => nlist
    [2] => #NEWSLIST#
)

Array
(
    [0] => <alist>#ACTIVITYLIST#</alist>
    [1] => alist
    [2] => #ACTIVITYLIST#
)

目前我的preg_replace_callback函数用$ matches [0]替换匹配值。我想要做什么,并想知道是否可能是替换标签内的所有内容($ matches [2]),同时能够进行$ matches [1]检查。

在此处测试我的正则表达式:http://rubular.com/r/k094nulVd5

1 个答案:

答案 0 :(得分:1)

您只需调整返回值即可包含想要替换的部分:

function replaceContent($matches = array()){
    if ($matches[1] == "nlist"){
        // do stuff
        return sprintf('<%s>%s</%s>',
                       $matches[1],
                       'replace value',
                       $matches[1]);
    } elseif ($matches[1] == "alist"){
        // do stuff
        return sprintf('<%s>%s</%s>',
                       $matches[1],
                       'replace value',
                       $matches[1]);
    }

    return false;
} 

preg_replace_callback('/<([n|a]list)\b[^>]*>(.*?)<\/[n|a]list>/','replaceContent', $page_content);

请注意:

  1. sprintf内的模式是根据preg_replace_callback使用的正则表达式生成的。
  2. 如果替换字符串需要包含原始信息(例如<nlist><alist>标记中的可能属性),则还需要将此数据导入捕获组,以便它在$matches内可用。