PHP Regex много совпадений

У меня есть Drupal конфиг файл, который содержит наборы строк, например:

 *     'driver' => 'mysql',
*     'database' => 'databasename',
*     'username' => 'username',
*     'password' => 'password',
*     'host' => 'localhost',
*     'prefix' => '',

(2 раза на самом деле), и он также имеет набор строк, как это:

    array (
'database' => 'dba',
'username' => 'admin',
'password' => 'admin1234',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);

(Происходит только 1 раз в файле)

Разница, как показано, заключается в том, что на линиях, на которые нужно нацелиться / сопоставить, нет звездочки * (тэги комментариев).

Я использую следующее регулярное выражение, но оно не возвращает нужную строку.

preg_match("#'password' => '(.*?)'#isU",$file_source , $pass);

Это моя попытка демонстрации шаблона регулярных выражений: https://regex101.com/r/lDA4y4/2

То, что я хочу, это значение пароля: admin1234

2

Решение

Вы Можно взломать ваш конфигурационный файл с помощью регулярных выражений …

(вот демо для оптимизированного шаблона: /^ {6}'password' => '\K[^']*/m)

Тем не менее, я волнуюсь, что вы полностью упускаете из виду / красоту наличия .php Конфигурационный файл

Если вы просто include (или же require) файл в сценариях, которые в нем нуждаются, тогда у вас будет прямой и чистый доступ ко всем переменным и конфигурациям, которые он содержит. Это значит после:

include('config.php');  // you may need to modify the path for your case
$db=$databases['default']['default'];  // I recommend this line to simplify variable access

Вы сможете получить доступ к переменным, как это:

$db['database']; // = dba
$db['username']; // = admin
$db['password']; // = admin1234
$db['host']; // = localhost
$db['port']; // [empty string]
$db['driver']; // = mysql
$db['prefix']; // [empty string]

Как следствие, вы также получите выгоду от других некомментированных объявлений внутри.

$update_free_access = FALSE;
$drupal_hash_salt = 'N5wfuEGIDhz8C8LuelMlQjkosDt2Avr9ygNciIbmAqw';
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
ini_set('session.gc_maxlifetime', 200000);
ini_set('session.cookie_lifetime', 2000000);
$conf['404_fast_paths_exclude'] = '/\/(?:styles)|(?:system\/files)\//';
$conf['404_fast_paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i';
$conf['404_fast_html'] = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>';

Если вам не нужны какие-либо из этих других объявлений, вы закомментируете их или создаете вручную новый файл конфигурации, который содержит только ваши требуемые объявления (кроме того, вы можете упростить $databases структура массива).

1

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

Если вам нужна строка без *, просто проверьте строку, начинающуюся с пробела:

preg_match("/^\s+'password'\s=>\s'(.+)',/im", $source, $matches);
$pass = $matches[1];

Так в основном с ^\s+'password' Вы определяете это с начала строки ^ пока строка 'password', он может содержать только пробельные символы \s+ (1 или более).

Увидеть: https://regex101.com/r/KG4inA/2

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector