我有以下代码:
$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工作。它似乎不想在数组中工作,我不知道为什么......
答案 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";
}