【问题标题】:parsing inline variables from string from file in php从php文件中的字符串解析内联变量
【发布时间】:2013-10-03 09:23:52
【问题描述】:

我正在本地化我建立的网站。我通过读取 .lang 文件并根据所选语言将每一行(语法:key=string)放在一个变量中来做到这一点。

然后使用此数组将字符串放置在正确的位置。

我遇到的问题是某些字符串需要在它们中间有超链接,例如在某个地方我把我的名字链接到我的联系页面。或者网站的很多读数都需要在字符串中。

为了解决这个问题,我定义了一个包含 html + Forecaster + html 的变量, 并且本地化文件在字符串中包含 $Forecaster 变量。

我很快发现的问题是它顽固地拒绝从文件中解析字符串中的内联变量。

而是打印文件中的字符串和变量名。

我还没有找到让它解析变量的方法。

例如,“加热花费了 $str_time”将完全像这样打印在页面上,而不是输入之前定义的 $str_time 值。

我目前使用 fopen() 和 fgets() 打开和读取这些行。然后我分解它们以分离键和字符串,然后将它们放入数组中。

有没有办法让它解析变量,或者是否有另一种方法可以读取允许解析内联变量的行?

获取该行并将其转换为数组的代码如下所示:

(显然是循环播放)

#list($key, $string) = explode('=', $line);
$key = strtok($line, '=');
$string = strtok('=');
$local[$key] = $string;
$counter++;
echo  $local[$key] . "<br>";

计数器未使用,回显用于测试。

.lang 文件中的一行如下所示:

fuel.results.heatup.timeused=Heating up took $str_time

我会在我想要这样的字符串的地方调用数组:

$local['fuel.results.heatup.timeused']

如您所见,我已经尝试过 explode 和 strtok ,但没有任何作用。

【问题讨论】:

  • 请出示您的代码。您是否使用双引号作为字符串分隔符?
  • 与其自己“创建”变量,为什么不在这个文件中使用真正的 PHP 代码来定义变量并包含它? (顺便说一句,我宁愿选择一个保存翻译的数组,而不是全局范围内的单个变量,而不是将其设为全局,而是将其包装在一个返回它的函数中。)
  • 如果我是唯一一个制作语言文件的人,我只会使用 php 文件。但由于其他人能够提供翻译,我希望 .lang 文件尽可能简单。
  • 当然我不使用"作为分隔符。我使用=作为分隔符将键与字符串分开。
  • 删除爆炸的东西会产生相同的结果。似乎问题出在 fgets 或附近。

标签: php string file parsing variables


【解决方案1】:

我个人会以 JSON 格式编写您的文本文件,以便更轻松地提取数据。

这里是直接来自 php 手册的解决方案:http://nz2.php.net/manual/en/function.eval.php

$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";

值得注意的是 eval() 以错误的方式使用可能会非常危险,因此请确保您的代码非常安全。如果有人用真正的 PHP 代码修改了你的 txt 文件,他们可以直接在服务器上执行它。

另一种方法需要您知道所有变量名称,然后可以执行以下操作:

$str = 'Heating up took $str_time';
echo 'str=' . str_replace('$str_time', $str_time, $str);

或者通过数组来实现:

$str = 'Heating up took $str_time as well as $other_value';
$vars = Array('str_time', 'other_value');
foreach($vars as $varName) {
  $str = str_replace('$' . $varName, $$varName, $str);
}
echo 'str=' . $str;

【讨论】:

  • 评估不起作用。而且这可能是不安全的,因为人们可以向 lang 文件添加额外的代码,但我显然不会使用这些。 (用户不能直接上传文件,他们通过我)。第二种解决方案有效,但需要大量额外代码,但到目前为止它是最可行的解决方案。
  • 您可以将所有变量添加到数组中并循环遍历它们以节省时间 - 请参阅更新的答案
  • 由于我想保留使用它们的定义,我可能只会编写一个函数,用另一个给定字符串替换给定字符串中的变量名。这很简单,不需要对现有代码进行大的更改。
【解决方案2】:

如果你不知道所有的变量名,你可以使用这个例子,不用eval()。建议避开eval()

$str = 'fuel.results.heatup.timeused=Heating up took $str_time';
$str_time = 'value';
if(preg_match('/\$([a-z0-9_]+)/i', $str, $v)) {
  $vname = $v[1];
  $str = str_replace('$'.$vname, $$vname, $str);
}
echo $str;      // fuel.results.heatup.timeused=Heating up took value

【讨论】:

  • 确实知道变量名称,因为我在使用字符串的位置之前定义了它们。语言文件创建者不应该能够定义自己的变量。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2021-06-23
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多