簡體   English   中英

preg_replace()在數組上不起作用

[英]preg_replace() not working on array

我有以下代碼:

$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數組的第一個條目是我要匹配的模式的一些正則表達式。 replace_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起作用了。 它似乎不想在數組中工作,我不確定為什么...

我根據您的原始帖子重建了腳本:

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

我只是注意到這一行可能無法達到您的期望:

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

您已經分割了代碼,因此很難分辨正在運行的代碼。 我認為是這樣,從所有部分重構如下:

<?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(...);的行上, PHP Notice: Array to string conversion echo preg_replace(...);

您(隱式)將preg_replace()返回的數組轉換為帶有echo的字符串。 由於您要為兩個參數的preg_replace傳遞array() ,因此您將獲得一個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";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM