Один из способов - взять массив $output
, возвращенный командой exec
, и превратить его обратно в одну строку:
$text = implode("\n", $output)
Затем использовать preg_match_all
, чтобы получить все ключевые слова. и значения
preg_match_all('/^(.*?)\\.*: (.+)/m', $text, $matches);
Тогда $matches[1][n]
будет иметь ключевое слово n
, а $matches[2][n]
будет иметь значение n
.
Regex Demo
^ # Start of line in multiline mode
( # Start of capture group 1
.*? # Match 0 or more characters until ...
) # End of capture group 1
\.* # Match 0 or more periods
: # Match a colon followed by a space
( # Start of capture group 2
.+ # Match 1 or more characters up to but not including a newline
) # End of capture group 2
Обновление
Каждый раз через l oop вы будете обрабатывать один домен и пары ключевое слово / значение. Что вы будете делать с ними, зависит от вас.
foreach ($query as $domain) {
$scanUrl = 'whois '. $domain->url;
$output = []; // start with an empty array
exec($scanUrl, $output);
$text = implode("\n", $output);
preg_match_all('/^(.*?)\\.*: (.+)/m', $text, $matches);
$n = count($matches[1]); // number of keyword/value pairs
for ($i = 0; $i < $n; $i++) {
// display next keyword/value pair:
echo $matches[1][$i], "->", $matches[2][$i], "\n";
}
}
Обновление 2
Вместо объединения массива строк, возвращаемых командой exec
, в единственная строка и выполнение preg_match_all
, которое затем даст вам массив совпадений, может быть удобнее делать отдельные вызовы preg_match
для отдельных строк вывода из команды exec
:
foreach ($query as $domain) {
$scanUrl = 'whois '. $domain->url;
$output = []; // start with an empty array
exec($scanUrl, $output);
foreach ($output as $line) {
if (preg_match('/^(.*?)\\.*: (.+)/', $line, $matches)) {
echo $matches[1], "->", $matches[2], "\n";
}
}
}