Regex для извлечения информации из файла wp-config

Я хочу создать скрипт для резервного копирования всех моих установок WordPress без необходимости отмечать все каталоги.

Я хочу проверить наличие файла wp-config.php и создать резервную копию базы данных с информацией в этом файле.

Вот мой скрипт, который всегда выводит «ничего не найдено»:

$content = file_get_contents($sub_dir . '/wp-config.php');
if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", preg_quote($content, '/'), $result)) {
print_r($result);
}
else
print "nothing found\n";

Я хочу сделать такой же анализ с DB_USER, DB_PASSWORD, а также DB_HOST,

Вот пример содержимого в этом файле конфигурации:

../...

// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'thedbname');

/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'thedbuser');

/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'thedbpassword');

/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'thedbhost');

../...

0

Решение

Функция preg_quote() экранирует регулярные выражения специальных символов, в том числе ( а также )поэтому ваша строка темы не содержит

define('DB_NAME', 'thedbname');

Вместо этого он содержит

define\('DB_NAME', 'thedbname'\);

и ваше регулярное выражение не работает.

Просто удалите preg_quote() из вашего кода, вот так:

if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", $content, $result)) {
print_r($result);
} else { // note: I added braces; it's better to use them always.
print "nothing found\n";
}

Это работает правильно и выводит:

Array
(
[0] => Array
(
[0] => define('DB_NAME', 'thedbname')
)

[1] => Array
(
[0] => thedbname
)

)

демонстрация.

2

Другие решения

Вот это функция, которая читает все WP DB определяет:

function get_wordpress_data() {
$content = @file_get_contents( '../wp-config.php' );

if( ! $content ) {
return false;
}

$params = [
'db_name' => "/define.+?'DB_NAME'.+?'(.*?)'.+/",
'db_user' => "/define.+?'DB_USER'.+?'(.*?)'.+/",
'db_password' => "/define.+?'DB_PASSWORD'.+?'(.*?)'.+/",
'db_host' => "/define.+?'DB_HOST'.+?'(.*?)'.+/",
];

$return = [];

foreach( $params as $key => $value ) {

$found = preg_match_all( $value, $content, $result );

if( $found ) {
$return[ $key ] = $result[ 1 ][ 0 ];
} else {
$return[ $key ] = false;
}

}

return $return;
}

это возвращает массив как это:

array (size=4)
'db_name' => string '.........'
'db_user' => string '.........'
'db_password' => string '.........'
'db_host' => string 'localhost'
0