Preg_replace 和 Preg_replace_callback

Preg_replace and Preg_replace_callback

我正在更新我的编码并从 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 中与 (.*?) 匹配的文本片段,但我无法在开关中处理这些文本。

有关如何解决此问题或更好的编码方法的任何建议。 上面的例子只是会匹配的几个选项,实际的列表要大得多。

首先,您应该将函数名称作为字符串传递:"parse_callback".

如您所见,match[0] 将 return 整个匹配文本 ("[intern=test]te[/intern]")。您可以在 group:

中捕获标签名称
$Patroon = "'\[(intern)=(.*?)\](.*?)\[/intern\]'";
  • 注意 (intern)
  • 中的括号

这样,标签名称将由 $match[1] 编辑。return。

并将这种方法用于所有模式:

$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