изменение значения замены в preg_replace_callback - PullRequest
0 голосов
/ 06 сентября 2011
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 () возвращает этот массив, если совпадения найдены:

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

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

В данный момент моя функция preg_replace_callback заменяет значение совпадений на $ match [0]. То, что я пытаюсь сделать, и задаюсь вопросом, если вообще возможно, это заменить все, что находится внутри тегов ($ match [2]), и в то же время иметь возможность выполнить проверку $ match [1].

Проверьте мое регулярное выражение здесь: http://rubular.com/r/k094nulVd5

1 Ответ

1 голос
/ 06 сентября 2011

Вы можете просто настроить возвращаемое значение, включив в него части, которые не хотите заменить без изменений:

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.
...