preg_replace()不在数组上工作

时间:2014-05-10 16:35:57

标签: php arrays regex

我有以下代码:

$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工作。它似乎不想在数组中工作,我不知道为什么......

3 个答案:

答案 0 :(得分:0)

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

<?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)

答案 1 :(得分:0)

我刚注意到这条线可能无法产生你期望的结果:

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);

答案 2 :(得分:0)

您已经拆分了代码,因此告诉您正在运行的内容非常棘手。我认为就是这样,从以下所有部分重建:

<?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";
}
相关问题