2015-11-06 53 views
1

我正在更新我的编码并将其从preg_replace转移到函数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的文本,它们与(.*?)匹配,但我无法在交换机中处理这些文本。

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

回答

2

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

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

这样

$Patroon = "'\[(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

谢谢,它完美的作品。 – Ralf

+0

我很高兴。另外请记住,您可以轻松地将最后2个模式合并为1. – Mariano

+0

您的意思是,您可以将最后两个模式合并为1吗?不知道我是否完全理解你的意思。 – Ralf

相关问题