我有一个字符串,其中包含纯文本“[var-X]”的各种实例,其中X可以是任何正整数。我不知道X在任何给定的脚本中有多高(但是如果有必要,我可以得到它)。
必须评估这些[var-X]中的每一个并用不同的字符串替换。不同字符串的值取决于外部xml文件,我没有解析问题。
所以,我的问题是,如何从
开始$str = "Hey I am some text,[var-1] a lot of these [var-3] parts will have to [var-9] go away and
be exchanged [var-2] by others";
加(假设这个东西在更大的xml里面)
(some xml...)
<Variation id="1">really</Variation>
<Variation id="2">quickly</Variation>
<Variation id="3">strange</Variation>
(some other xml...)
<Variation id="9">definitely</Variation>
(more xml...)
到
$str = "Hey, I am some text, really a lot of these strange parts will have to definitely go away
and be exchanged quickly by others";
首先迭代我的xml是最好的方法,找出整数有多高,然后再用字符串上的strpos迭代?
我如何处理我可能会找到[var-7]和[var-72](事先不知道数字的长度)的事实?
这可以用正则表达式完成(假设一旦我有“[var-7]”而“7”作为整数我还需要处理一些东西来知道要放置什么)?< / p>
我希望问题清楚。我的不确定性主要是关于最好的方法,因为我可能能够将某些东西混在一起,但它可能是缓慢而丑陋的。
答案 0 :(得分:4)
您可以使用 preg_replace_callback ,它允许您使用函数作为替换。
$txt = preg_replace_callback('~\[var-(\d+)]~', function ($match) {
return $var[$match[1]];
}, $txt);
如果要从XML文档中提取值,使用XPath是一种好方法。例如:
$str = "Hey I am some text,[var-1] a lot of these [var-3] parts will have"
. " to [var-9] go away and be exchanged [var-2] by others";
$xml = <<<'LOD'
<?xml version="1.0"?>
<Variations>
<Variation id="1">really</Variation>
<Variation id="2">quickly</Variation>
<Variation id="3">strange</Variation>
<Variation id="9">definitely</Variation>
</Variations>
LOD;
$doc = new DOMDocument();
@$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
$callback = function ($match) use ($xpath) {
$var_node = $xpath->query("/Variations/Variation[@id='"
. $match[1] . "']/text()")->item(0);
$var_content= $var_node->nodeValue;
return $var_content;
};
$str = preg_replace_callback('~\[var-(\d+)]~', $callback, $str);
答案 1 :(得分:2)
您最好的选择是使用preg_replace_callback。在下面的代码中我直接使用你的数组,但你说你想从xml读取,所以你从它读取的逻辑将取代简单的数组访问。如果索引与xml中的任何内容不对应,您可能还需要考虑要执行的操作。在下面的示例中,我假设您根本不想替换它,但这取决于您。
$str = "Hey I am some text,[var-1] a lot of these [var-3] parts will have to [var-9] go away and be exchanged [var-2] by others";
$var[1] = "really";
$var[2] = "quickly";
$var[3] = "strange";
$var[9] = "definitely";
$done = preg_replace_callback('/(?P<original>\[var-(?P<index>\d+)\])/', function($match) use($var) {
return isset($var[$match['index']]) ? $var[$match['index']] : $match['original'];
}, $str);
echo $done;
答案 2 :(得分:0)
如果您想避免使用preg_replace_callback,您可以执行以下操作:
while(preg_match('/\[var-(\d+)\]/', $str, $m)){
$str = preg_replace('/\[var-' . $m[1] . '\]/', $var[$m[1]], $str);
}