Intereting Posts
Расчет расстояний между двумя точками в Laravel Сайт Magento не работает после обновления расширений Приложение C # должно отправлять некоторые данные на веб-сайт php, но должно уважать политику аутентификации Встраивание PHP в XML Запретить отображение страницы ошибок CSRF по умолчанию в Codeigniter Как отправить массив JSON, содержащий jsonobjects на php-сервер PHP: запись простой функции removeEmoji ORDER BY с двумя столбцами в MySQL Правильный способ добавления нового поля в страницу продукта администратора в Prestashop 1.7 Пытается генерировать пропорционально обрезанные миниатюры с фиксированной шириной / высотой с помощью PHP GD resize () не работает, используя класс манипуляции с изображениями Невозможно ли доступ к элементам в ассоциативных массивах PHP численно (то есть по индексу)? flex actionscript не загружает файл на страницу PHP ПОМОЩЬ! Как индексировать XML-элементы в PHP? вырезать многобайтовое пустое пространство из строки PHP

Многолинейный режим Regex не работает как ожидалось для дополнительной группы

У меня есть следующий текстовый источник:

 PHPUnit 5.7.5 от Себастьяна Бергмана и участников.

 ..................... E ..... R ...................... ........... 61/1485 (1%)
 1485/1485 (100%)

 Время: 1,51 минуты, Память: 102,00 МБ

 --- информация об ошибке пропущена ---

 ОШИБКИ!
 Тесты: 1485, Утверждения: 14821, Ошибки: 1, Сбои: 1.

Мне нужно разобрать в реальном времени (потоковый вывод на stdout) следующие символы: EFWIRS. (ошибка, отказ, предупреждение и т. д.) и доступная строка статистики (числа и проценты в EOL). Итак, в результатах я, кроме чего-то вроде этого:

  ....... 

или

  ..................... E ..... R ...................... ........... 

или

  ..................... E ..... R ...................... ........... 61/1485 (1%) 

или

  1485/1485 (100%) 

но нет

  ..................... E ..... R ...................... ........... 61/1485 ( 

или

  ..................... E ..... R ...................... ........... 61/1485 (1) 

или

  ..................... E ..... R ...................... ........... 61 / 

Моим регулярным выражением является / /^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\)\n)?/m (?:\ /^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\)\n)?/m строка в случае, если тесты не удались (см. пример вывода). Я пытаюсь /^[ /^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\))?$/m неполный блок статистики полностью и соответствует только цельной строке, несмотря на необязательную группу (...)? , который работает в первом регулярном выражении, как ожидалось.

PS Я знаю о пользовательских принтерах для PHPUnit, но в моем случае они не подходят, и мне нужно разобрать общий вывод.

Я считаю, что вы должны использовать lookahead, чтобы гарантировать правильность символов, чтобы они соответствовали и исправляли последствия их в строке.

Я привел пример для вас здесь . Сам шаблон равен ^([EFWIRS.](?=[EFWIRS.\s]))+\s+(\d+\s*\/\s*\d+\s*\(\s*\d+%\s*\))?$ Я не уверен в вашем механизме захвата вывода, поэтому не могу советовать о модификаторах и какие функции PHP использовать повторно. Пример вниз по ссылке предполагает полный многострочный текст, поэтому он использует глобальные и многострочные модификаторы (это означает, что preg_match_all и #pattern#m будут использоваться в php-коде).

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

[.EFWIRS]+(?=\s+\d) .

Ссылка на регулярное выражение

В этом случае более дешевые негативные сюжеты лучше, чем не захватывающие группы.