如何解析从XML文件中提取的PHP变量?

如何解析从XML文件中提取的PHP变量?,php,xml,Php,Xml,首先,我从一个XML文件中提取文本,它只是一个名称,并将其放入$name变量中 然后我从另一个XML文件中提取一些其他文本,该文本包含一个变量,比如: <list> <wishes> <id>001</id> <text>Happy birthday, '.$name.'</text> </wishes> </list> 结果将是: Wishes for John. Wish examp

首先,我从一个XML文件中提取文本,它只是一个名称,并将其放入
$name
变量中

然后我从另一个XML文件中提取一些其他文本,该文本包含一个变量,比如:

<list>
 <wishes>
  <id>001</id>
  <text>Happy birthday, '.$name.'</text>
 </wishes>
</list>
结果将是:

Wishes for John.
Wish example: Happy birthday, '.$name.' something something
它会将变量视为纯文本,而不是将其替换为人员的实际姓名


那么,如果变量包含在XML文件中,如何强制它用实际名称替换
$name
变量?顺便说一句,我还尝试在XML文件中的不同位置包含
echo
print
,方法是设置另一个变量,该变量将打印XML文件的内容,然后将该变量设置为最后被回显的变量-不走运,它只是一直将其视为文本。

这样编写,因此它是格式良好的XML:

<text>Happy birthday, <var name="name" /></text>
生日快乐,
然后像这样解析XML文件(PHP短数组形式):

$memory=[
'name'=>'Christopher Robin',
//'其他'=>'值',
//“走”=>“这里”,
];
$parsed=preg\u replace\u回调(
'##',
函数($matches)使用($memory){
如果(数组\键\存在($matches[1],$memory)){
返回$memory[$matches[1]];
}
返回“”;//引用的变量不在$memory中!
}
);
这应该可以让您继续(我不确定,从我的头顶上看,它是$matches[1]还是$matches[0]——您可以打印$matches来检查它是哪一个)

您的XML现在是:

<text>Happy birthday, Christopher Robin</text>
生日快乐,克里斯托弗·罗宾

或者您可以声明一个流XML解析器来处理每个标记并适当地输出它。在这里,您只能将
text
输出到stdout,而
var
将使用与上面相同的方法返回。结果就是文本“生日快乐,克里斯托弗·罗宾”

是否足够?我觉得,允许任意变量替换,甚至使用eval,都可能会让代码爆炸。原始文本从何而来?我不确定PO是否能够将变量的语法更改为您建议的语法。@Michael他确实写了“正如您所看到的,我已经尝试格式化它了”,所以我认为他可以控制。但是,通过将regexp更改为#'\.\$(.*?\。。#但是,答案应该与现在的语法一致。@LSemi cool-只是想指出一下,以防您错过它。:)
$memory = [
    'name' => 'Christopher Robin',
    //'other' => 'values',
    //'go' => 'here',
];

$parsed = preg_replace_callback(
    '#<var name="(.*?)"\\s*/>#',
    function ($matches) use ($memory) {
        if (array_key_exists($matches[1], $memory)) {
            return $memory[$matches[1]];
        }
        return ''; // A referred variable is not in $memory!
    }
);
<text>Happy birthday, Christopher Robin</text>