【问题标题】:preg_replace() not working on arraypreg_replace() 不适用于数组
【发布时间】:2014-05-10 16:35:56
【问题描述】:

我有以下代码:

$pattern_dig_answer = array(); // Identify patterns to replace and their replacements
$pattern_dig_answer[0] = "/(.*)IN(\s+)A(.*)/";
$replacement_dig_answer = array();
$replacement_dig_answer[0] = "<span style='color:red;'>$1IN$2A$3</span>";

pattern_dig_answer 数组的第一个条目是我要匹配的模式的一些正则表达式。 replacement_dig_answer 的第一个条目是我要替换正则表达式找到的内容。

然后我像这样执行挖掘:

$dig_answer = exec("dig {$_SESSION['domain']} $digrecords[2] $digops[0] $digops[1] $digops[2] $digops[3]", $dig_answer_raw);

您可能猜到了,它使用从用户输入捕获的会话变量执行 dig 命令,然后将输出保存到 $dig_answer_raw。

我现在要做的是使用以下内容清理挖掘:

$dig_answer_out = preg_grep('/IN/', $dig_answer_raw);

然后我回显结果:

echo implode("\n", $dig_answer_out);

到目前为止,这一切都很好。只有当我执行以下操作时才会卡住:

echo preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out);

现在,根据我所做的调查,这应该可行。 preg_replace 的文档清楚地表明它可以在普通字符串中搜索,也可以通过带有字符串条目的数组进行搜索(我假设我有)。是什么让我认为我可能不会,因为我将 dig 命令更改为:

$dig_answer = shell_exec("dig {$_SESSION['domain']} $digrecords[2] $digops[0] $digops[1] $digops[2] $digops[3]");

它的作用就像一个魅力,但是即使在改变所有变量之后,也会否定 preg_grep 之前所做的所有输出清理。

我在这里遗漏了什么非常明显的东西吗?

编辑:为了尝试简化我的问题,当我的 dig 命令从将输出保存到数组的 exec() 更改为将输出保存到字符串的 shell_exec 时,preg_replace 就可以工作了。它似乎不想在数组中工作,我不确定为什么......

【问题讨论】:

  • "然而,即使在更改了所有变量之后,preg_grep 之前所做的所有输出清理也会被否定。" — 你的意思是什么?
  • 当我将 dig 命令替换为:$dig_answer = shell_exec("dig {$_SESSION['domain']} $digrecords[2] $digops[0] $digops[1] $digops[2] $digops[3]"); 然后:echo preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out); 它可以工作。
  • you're first 'pattern_dig_answer' 缺少美元符号
  • @chiliNUT 恐怕我的复制/粘贴技能失败了。感谢您指出这一点。我现在会修补它。
  • @id0827502:那我不知道你在问什么。您可以编辑问题以包含 just 不起作用的部分吗?我认为这有助于澄清您的要求。

标签: php arrays regex


【解决方案1】:

您已经拆分了代码,因此很难判断您正在运行什么。我想就是这样,从所有部分重构如下:

<?php
$pattern_dig_answer = array(); // Identify patterns to replace and their replacements
$pattern_dig_answer[0] = "/(.*)IN(\s+)A(.*)/";
$replacement_dig_answer = array();
$replacement_dig_answer[0] = "<span style='color:red;'>$1IN$2A$3</span>";

$dig_answer = exec("dig google.com", $dig_answer_raw);
$dig_answer_out = preg_grep('/IN/', $dig_answer_raw);
echo implode("\n", $dig_answer_out);
echo preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out);

当我通过 CLI (PHP 5.5.11) 运行此程序时,我收到一条警告:PHP Notice: Array to string conversion 在您调用 echo preg_replace(...); 的行上。

您正在(隐式)将preg_replace() 返回的数组转换为带有echo 的字符串。由于您为两个参数传递了array()preg_replace,因此您将返回array(如您所假设的那样)。转储这些以查看内部内容的最佳方法是使用var_dump()。如果您想以不同的方式打印它,您可以使用 foreach 循环并打印该元素。

<?php
$pattern_dig_answer = array(); // Identify patterns to replace and their replacements
$pattern_dig_answer[0] = "/(.*)IN(\s+)A(.*)/";
$replacement_dig_answer = array();
$replacement_dig_answer[0] = "<span style='color:red;'>$1IN$2A$3</span>";

$dig_answer = exec("dig google.com", $dig_answer_raw);
$dig_answer_out = preg_grep('/IN/', $dig_answer_raw);
implode("\n", $dig_answer_out);
$total_output = preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out);
foreach ($total_output as $output) {
    echo $output."<br />\n";
}

【讨论】:

  • 感谢您对此的解释。这有点经验法则吗?如果它进入一个字符串,它需要出来一个字符串?数组也是如此。我需要在数组上做更多的功课……有什么建议吗?
  • 不是真的,PHP 的经验法则有点奇怪,没有。对于数组,就其他语言而言,它们不像 C 或 Java 中的数组或 Python 中的列表。就 Python 而言,它们更接近于介于列表和字典之间,并且不能必然通过索引进行迭代。 PHP array 文档对数组的许多奇怪部分也非常清楚。
  • 一个好的建议是查看 PHP 站点文档以了解每个参数是什么以及它是如何返回的。有时错误是返回值,有时不是。有时返回值被返回,有时你必须给它你希望它作为参数填充的变量。
【解决方案2】:

我根据您的原始帖子重构了脚本:

<?php

$dig_answer = exec("dig www.google.com.au", $dig_answer_raw);

$dig_answer_out = preg_grep('/IN/', $dig_answer_raw);

$pattern_dig_answer = array(); // Identify patterns to replace and their replacements
$pattern_dig_answer[0] = "/(.*)IN(\s+)A(.*)/";
$replacement_dig_answer = array();
$replacement_dig_answer[0] = "<span style='color:red;'>$1IN$2A$3</span>";

$x = preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out);
print_r($x);

这个脚本的输出看起来对我有用:

Array
(
   [8] => <span style='color:red;'>;www.google.com.au.      IN  A</span>
   [11] => <span style='color:red;'>www.google.com.au.  125 IN  A   203.219.219.163</span>
   ...
)

我错过了什么吗?作为参考,这是我的php -v 的输出。

PHP 5.4.24 (cli)(构建时间:2014 年 1 月 19 日 21:32:15)

【讨论】:

    【解决方案3】:

    我刚刚注意到这条线可能不会产生您所期望的:

    echo preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out);

    在这种情况下,preg_replace() 将返回一个数组,因为您已将数组作为第一个和第二个参数传递。试试这个:

    $foo = preg_replace($pattern_dig_answer, $replacement_dig_answer, $dig_answer_out); var_dump($foo);

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2016-03-03
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2017-10-10
      相关资源
      最近更新 更多