【问题标题】:How to parse PHP variable pulled from XML file?如何解析从 XML 文件中提取的 PHP 变量?
【发布时间】:2019-07-29 22:06:36
【问题描述】:

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

然后我从不同的 XML 文件中提取一些其他文本,该文本包含一个变量,假设:

<list>
 <wishes>
  <id>001</id>
  <text>Happy birthday, '.$name.'</text>
 </wishes>
</list>

如您所见,我已经尝试以一种应该 conc... conat... 解析它的方式对其进行格式化,但它没有。一旦我将它包含在这样简单的东西中:

foreach ($people->user as $person) {

   if ($person->date == date('d.m')) {

      $name = $person->name;

         foreach ($list->wishes as $wish) {

            $text = $wish->text;

      }

   echo 'Wishes for '.$name.'.';
   echo 'Wish example: '.$text.' something something';

}

结果将是:

Wishes for John.
Wish example: Happy birthday, '.$name.' something something

它将变量视为纯文本,而不是用人的实际姓名替换它。

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

【问题讨论】:

  • $wish-&gt;text = str_replace('$name',$person-&gt;name,$wish-&gt;text) 够吗?我觉得允许任意变量替换甚至使用 eval 可以打开您的代码进行探索。原文到底是从哪里来的?

标签: php xml


【解决方案1】:

这样写,所以它是格式良好的 XML:

<text>Happy birthday, <var name="name" /></text>

然后像这样解析你的 XML 文件(PHP 短数组形式):

$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!
    }
);

这应该能让你继续前进(我不确定,不管是 $matches[1] 还是 $matches[0] - 你可以打印出 $matches 来检查它)。

您的 XML 现在是:

<text>Happy birthday, Christopher Robin</text>

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

【讨论】:

  • 我不确定 PO 是否能够将变量的语法更改为您建议的内容。
  • @Michael 他确实写了“如您所见,我已经尝试格式化它”,所以我认为他可以控制。但是,通过将正则表达式更改为 #'\.\$(.*?)\.'#,答案应该与现在的语法一样。
  • @LSemi 很酷 - 只是想指出它以防您错过它。 :)
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多