Preg_replace и Preg_replace_callback

1

Я обновляю свое кодирование и preg_replace от preg_replace к функции preg_replace_callback. На первом я использовал два массива, которые заменили все совпадения в части текста.

Я установил следующий новый фрагмент кода, но у меня возникают некоторые проблемы:

<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";

function parse_callback($match) {
        $hit = $match[0];
        switch ($hit){
                case '[alum]': 
                        return "<a href=\"/linktype1/\">link1</a>";
                        break;
                case '[fotoalbums]':
                        return "<a href=\"/linktype2/\">link2</a>";
                        break;
                case '[intern]':
                        return "<a href=\"". $match[1] ."\">$match[2]</a>";
                        break;
                default:
                        //return "UNKNOWN:$match";
                        return var_dump($match);
        }
}

$Patroon = "'\[intern=(.*?)\](.*?)\\[\/intern\]'";
$Patroon = "'\[fotoalbums\]'";
$Patroon = "'\[alum\]'";

$inhoud = preg_replace_callback($Patroon, parse_callback, $inhoud);
?>

Последние два в $Patroon являются проблемой, они будут обновлены, но я не могу обновить первый, поскольку найденное совпадение будет полной строкой. $match также будет содержать фрагменты текста от $inhoud на который совпал (.*?), Но я не смог обработать их в коммутаторе.

Любые предложения по устранению этой проблемы или лучшему подходу к кодированию. Вышеприведенный пример - это всего лишь несколько вариантов, которые будут сопоставлены, фактический список намного больше.

Теги:
preg-replace-callback

1 ответ

2
Лучший ответ

Прежде всего, вы должны передать имя функции в виде строки: "parse_callback".

Как вы заметили, match[0] вернет весь согласованный текст ("[intern=test]te[/intern]"). Вы можете записать имя тега в группе:

$Patroon = "'\[(intern)=(.*?)\](.*?)\[/intern\]'";
  • Обратите внимание на круглые скобки в (intern)

Таким образом, имя тега будет возвращено $match[1].

И используя этот подход ко всем шаблонам:

$Patroon = array(
    "'\[(intern)=(.*?)\](.*?)\[/intern\]'",
    "'\[(fotoalbums|alum)\]'"
);

Код

<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";

function parse_callback($match) {
        //check the value of the first capture
        $hit = $match[1];
        switch ($hit){
                case 'alum': 
                        return "<a href=\"/linktype1/\">link1</a>";
                        break;
                case 'fotoalbums':
                        return "<a href=\"/linktype2/\">link2</a>";
                        break;
                case 'intern':
                        return "<a href=\"$match[2]\">$match[3]</a>";
                        break;
                default:
                        //return "UNKNOWN:$match";
                        return var_dump($match);
        }
}

$Patroon = array(
    "'\[(intern)=(.*?)\](.*?)\[/intern\]'",
    "'\[(fotoalbums|alum)\]'"
);

$inhoud = preg_replace_callback($Patroon, "parse_callback", $inhoud);

echo $inhoud;
?>

Вывод

 dit is een test versie, waarin <a href="/linktype1/">link1</a> staat <a href="/linktype1/">link1</a> & <a href="/linktype2/">link2</a> om <a href="test">te</a> vervangen<p>

ideone demo

  • 0
    Спасибо, работает отлично.
  • 0
    Я рад. Также имейте в виду, что вы можете легко объединить последние 2 шаблона в 1.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню