Preg_replace和Preg_replace_callback

时间:2015-11-06 07:28:04

标签: php regex 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上匹配(.*?)的文本,但我无法在切换中处理这些文本。

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

1 个答案:

答案 0 :(得分:2)

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

正如您所注意到的,match[0]将返回整个匹配的文字("[intern=test]te[/intern]")。您可以在group中捕获标记名称:

$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