正则表达式为PHP preg_replace_callback

时间:2010-03-10 22:55:39

标签: php regex preg-replace-callback

正则表达式不是我的事。 :(

我有一个字符串,可能包含多个子字符串,例如:

[var1="111" var2="222" var3="222" var4="444"]

我基本上需要用获取每个变量的函数的结果替换每个匹配项。

$string = '[var1="111" var2="222" var3="333" var4="444"]';    
$regex = 'var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"';

function doit($matches){
    return "<strong>".implode(", ", $matches) ."</strong>";
}

echo preg_replace_callback($regex,'doit',$string);

我期待 111,222,333,444

但我没有感受到爱。任何帮助将不胜感激!

编辑:澄清......

我为了这个问题而进行了简化。

  1. “vars”不是真的 称为“var1”,“var2”更像 [recID =“22”template =“theName” option =“some value”,type =“list”]

  2. 回拨会更多 复杂然后我的简单 implode ...我会用“id”和 连接到数据库,得到 记录并将它们插入到 模板...因此需要 回电话......

  3. 匹配的值几乎可以 什么,不只是数字。

2 个答案:

答案 0 :(得分:1)

另一个答案可能是更好的解决方案,但是你可以通过preg_replace_callback来实现这个目标:

$string = '[var1="111" var2="222" var3="333" var4="444"]';

// Note: regular expressions need to start and end with /
$regex = '/var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"/';

function doit($matches){
    // The first element of matches is the complete
    // match, shift is here just to get rid of it
    // (probably a better way to do this)
    array_shift($matches);
    return "<strong>".implode(", ", $matches) ."</strong>";
}
echo preg_replace_callback($regex,'doit',$string);

答案 1 :(得分:1)

我会分两步完成:

  1. 获取标签
  2. 获取每个标记的属性
  3. 以下是一个例子:

    function doit($match) {
        $parts = preg_split('/(\w+="[^"]*")/', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        foreach ($parts as $part) {
            if (trim($part) !== "") {
                if (!preg_match('/^(\w+)="([^"]*)"$/', $part, $match)) {
                    // syntax error
                } else {
                    var_dump($match);
                }
            }
        }
    }
    
    $str = '[var1="111" var2="222" var3="333" var4="444"]';
    $re = '/\[((?:[^"[\]]+|"[^"]*")*)]/';
    preg_replace_callback($re, 'doit', $str);
    

    有了这个,您甚至可以检测到语法错误。

    这不是一个完美的解决方案,因为按字符读取输入字符并根据它们所在的上下文确定令牌会更有效。