0
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

4

1 回答 1

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.
于 2011-09-06T07:12:05.437 回答