preg_match первая строка после строки в скобках - PullRequest
0 голосов
/ 17 февраля 2019

Я искал решения, близкие к этому, но не смог найти решение.Я пытаюсь очистить некоторый унаследованный код с помощью php_codesniffer, но средство исправления не исправляет комментарии или массивы, превышающие 80 столбцов, просто сообщает вам о них.У меня есть решение, которое работает для комментариев, но я застреваю в регулярном выражении для массивов.Пример строки, которую я хотел бы исправить:

$line = "drupal_add_js(array('my_common' => array('my_code_validate' => variable_get('my_code_validate', FALSE), 'inner_index2 => 'inner_value2'), 'another_item' => 'another_value'), 'setting');";
$solution = preg_match('/array.*(\(.*?\))/', $line);
echo $solution;

Я бы хотел

$solution  = "'my_common' => array('my_code_validate' => variable_get('my_code_validate', FALSE), 'inner_index2 => 'inner_value2'), 'another_item' => 'another_value'";

, но вместо этого я получаю 1.Обратите внимание, что там есть другой массив, который довольно распространен.Я хочу захватить только значения первого массива, а затем разделить их на отдельные строки.В конечном итоге я хотел бы поделиться своими решениями для проекта php codesniffer, чтобы получить бонусные баллы за то, как показать, как кодировать новый фиксатор для squizlabs.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы можете использовать

if (preg_match('~array(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
  echo $matches[2];
}

См. это демо .

Подробности

  • array- буквальная подстрока
  • (\(((?:[^()]++|(?1))*)\)) - группа 1:
    • \(
    • ((?:[^()]++|(?1))*) - группа 2 (требуемое значение):
      • (?:[^()]++|(?1))* - ноль или более повторений 1+ символов, отличных от ( и ) или рекурсивного шаблона 1 группы
    • \) - ) char
0 голосов
/ 17 февраля 2019

Попробуйте это решение:

.*?array\(('.*?)\), [^\)]+'\);.*

Заменить на:

$1

Демо: https://regex101.com/r/oV4nvT/4/

...