2

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

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

[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. 回调会比我的简单内爆更复杂......我会使用“id”并连接到数据库,获取记录并将它们插入模板......因此需要回调......

  3. 匹配的值几乎可以是任何东西,而不仅仅是数字。

4

2 回答 2

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);
于 2010-03-10T23:15:27.957 回答
1

我会分两步完成:

  1. 获取标签
  2. 获取每个标签的属性

这是一个例子:

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);

有了它,您甚至可以检测语法错误。

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

于 2010-03-10T23:32:59.743 回答