PHP – 用其他不同的字符串替换多个相似的字符串


PHP – Substitute multiple similar strings with other different strings

我有一个字符串,其中包含纯文本"[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"作为整数,我仍然需要处理一些东西来代替它(?

我希望这个问题是明确的。我的不确定性主要是关于最好的方法,因为我可能能够破解一些东西,但它可能是缓慢和丑陋的。

您可以使用允许您

使用函数作为替换的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);

最好的办法是使用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;
如果你想

避免使用preg_replace_callback你可以做如下的事情:

while(preg_match('/'[var-('d+)']/', $str, $m)){
  $str = preg_replace('/'[var-' . $m[1] . '']/', $var[$m[1]], $str);
}