Регулярное выражение — получение значения свойства класса

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть строка, подобная:

 public $host = 'sth'; public $user = 'sth'; public $password = 'sth';public $db = 'dbname';        public $dbprefix = 'sth';
  

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

 #(.*)public(.*)$db(.*)=(.*)'(.*)';#is
  

результат пустого массива

Пожалуйста, не пишите, что я могу получить экземпляр класса и свойства, потому что я не могу, и это все. Существует больше возможностей, чем regex.

Проблема решена!

 $file="public $host = 'sth';        public $user = 'sth';        public $password = 'sth';        public $db = 'get this value';
        public $dbprefix = 'sth';";
$regex = "/.*publics $dbs =s '(.*?)';/i";
preg_match($regex,$file,$matches);
echo '<br><pre>';var_dump($matches);
  

$matches[1] — это ‘получить это значение’;

Комментарии:

1. Почему вы записываете все свои .* файлы?

Ответ №1:

Хотя я уверен, что есть лучший способ достичь того, чего вы хотите, вот регулярное выражение, которое должно соответствовать значению $db :

 /publics $dbs*=s*'(.*?)';/i
  

Посмотрите, как это используется здесь.

Комментарии:

1. Если быть точным, проблема была не устранена $ .

2. @NiettheDarkAbsol Не только это, '(.*)' соответствовало большему количеству, чем хотел OP, я сделал это нежадным.

3. preg_match('/publics $dbs =s '(.*?)';/i',$file,$matches); пустой массив

Ответ №2:

Вы могли бы сделать так,

 <?php
$mystring = <<<'EOD'
public $host = 'sth'; public $user = 'sth'; public $password = 'sth';public $db = 'dbname';        public $dbprefix = 'sth';";
EOD;
$regex = '~(?<=public $db = ')[^']*~';
preg_match_all($regex, $mystring, $matches);
var_dump($matches);
?>
  

Вывод:

 array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(6) "dbname"
  }
}
  

Комментарии:

1. вам нужно экранировать $ символ во входных данных, как я сделал в своем примере.

2. Я не могу. Строка является динамической, и я ничего не могу там изменить

3. @turson теперь вам не нужно экранировать $ во входных данных.