Regexp для извлечения данных в несколько строк

Мне нужно захватить каждое определение случая и затем связанное с ним имя файла php. Я успешно получил это выражение для работы с отдельными позициями

$re = 'case [\"|\'](.*?)[\"|\'].*=[\s|\"|\'](.*?\.php)';

Строка, с которой я работаю:

 //--- the following 2 lines are captured
case 'course_leaders'           : $page='admin/p-members/email-leaders.php'; break;
case 'courseDifferences'        : $page='admin/p-events/diff.php'; break;

//--- the following two cases are not processed/captured
case 'course_leaders_report'    :
wp_enqueue_script( 'crsLeaders'
, plugin_dir_url(__FILE__).'admin/js/jquery.tablesorter.min.js'
, array('jquery') );
$page='admin/p-events/leaders-report.php';
break;
case 'course_listing'           :
wp_enqueue_script('courseListingDataTables' //--- name
//--- location of js file relative to this file
, plugin_dir_url(__FILE__).'admin/js/DataTables/datatables.min.js'
, array('jquery') //--- use jquery
);
wp_enqueue_script( 'jquery' );
$page='admin/p-events/list-report.php';
break;

//--- this is being captured
case 'course_program' : $page='admin/p-program/courseProgram.php'; break;

Course_leaders_report и course_listing не регистрируются (с сайта regexp101.com).

Full match  798-866 `case 'courseDifferences'  : $page='admin/p-events/diff.php`
Group 1.    804-821 `courseDifferences`
Group 2.    843-866 `admin/p-events/diff.php`
Match 7
Full match  2036-2110   `case 'course_program' : $page='admin/p-program/courseProgram.php`
Group 1.    2042-2056   `course_program`
Group 2.    2077-2110   `admin/p-program/courseProgram.php`

1

Решение

В PHP подстановочный знак . не включает переводы строк. Итак, включите их сами:

case [\"|\'](.*?)[\"|\'](.|\n)+?=[\s|\"|\'](.*?\.php)

Обратите внимание на изменение в середине: .* в (.|\n)+?что делает квантификатор ленивым.

Regex demo

Или, как указывает @TimBiegeleisen в комментариях, вы можете добавить флаг s запустить регулярное выражение в dot all Режим:

/case [\"|\'](.*?)[\"|\'].+?=[\s|\"|\'](.*?\.php)/gs

Обратите внимание, что вам все еще нужно добавить ? в квантификатор, чтобы сделать его ленивым.

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

2

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

Шаблон: ~case ["'](\w+)["']\s*:.*?\$page=["']([\w/-]*\.php)~s

(Образец Демо)

Разбивка паттернов:

~                #pattern delimiter
case ["']        #match "case", a space, then a single or double quote
(\w+)            #capture group #1: greedily match one or more characters in range: A-Za-z0-9_
["']             #match single or double quote
\s*              #greedily match zero or more whitespace characters
:                #match colon
.*?              #lazily match any character (including whitespaces because of "s" pattern flag) zero or more times
\$page=["']      #match "$page=", then a single or double quote
([\w/-]*\.php)   #capture group #2: greedily match zero or more characters in range: A-Za-z0-9_/-
~                #pattern delimiter
s                #pattern modifier/flag -- makes dot also match whitespace characters

Жизненно важные точки:

  • [\"|\'] <- это не способ определения содержимого класса символов. Если вы хотите использовать класс символов для перечисления двух символов, используйте ['"], Если вы хотите использовать чередование, вам нужно будет использовать конвейер, и в контексте этого вопроса вам нужно будет обернуть альтернативы в группу без захвата для поддержки логики шаблона: (?:'|"), Правда в том, что альтернативы и группы захвата стоят «шагов», поэтому лучшим синтаксисом будет класс символов.
  • Используя размещенные примеры данных, группы захвата могут содержать очень сфокусированные классы символов. При этом вы можете использовать «жадное» сопоставление. Жадное соответствие превосходит Ленивое соответствие с точки зрения шагов. Всегда старайтесь использовать жадные совпадения, когда это возможно.
  • s Модификатор шаблона позволяет точку (.) также сопоставлять пробельные символы. Это может быть воспроизведено с [\s\S], но . с s Модификатор более краткий.
  • Я не уверен, если в том числе $page= повышает точность ваших реальных данных, но это точно не повредит. Из моего тестирования, в том числе $page на самом деле повышает эффективность из-за ленивого сопоставления точек перед ним.
  • Я использую синтаксис NOWDOC в моих объявлениях переменных, так что мне не нужно ни экранировать кавычки, ни предпринимать какие-либо шаги, чтобы предотвратить синтаксический анализ строк.

Код: (демонстрация)

$input=<<<'INPUT'
//--- the following 2 lines are captured
case 'course_leaders'           : \$page='admin/p-members/email-leaders.php'; break;
case 'courseDifferences'        : \$page='admin/p-events/diff.php'; break;

//--- the following two cases are not processed/captured
case 'course_leaders_report'    :
wp_enqueue_script( 'crsLeaders'
, plugin_dir_url(__FILE__).'admin/js/jquery.tablesorter.min.js'
, array('jquery') );
$page='admin/p-events/leaders-report.php';
break;
case 'course_listing'           :
wp_enqueue_script('courseListingDataTables' //--- name
//--- location of js file relative to this file
, plugin_dir_url(__FILE__).'admin/js/DataTables/datatables.min.js'
, array('jquery') //--- use jquery
);
wp_enqueue_script( 'jquery' );
$page='admin/p-events/list-report.php';
break;

//--- this is being captured
case 'course_program' : $page='admin/p-program/courseProgram.php'; break;
INPUT;

$regex=<<<'REGEX'
~case ["'](\w+)["']\s*:.*?\$page=["']([\w/-]*\.php)~s
REGEX;

if (preg_match_all($regex, $input, $out)) {
var_export($out);
}else{
echo 'fail';
}

Выход:

array (
0 =>
array (
0 => 'case \'course_leaders\'           : \\$page=\'admin/p-members/email-leaders.php',
1 => 'case \'courseDifferences\'        : \\$page=\'admin/p-events/diff.php',
2 => 'case \'course_leaders_report\'    :
wp_enqueue_script( \'crsLeaders\'
, plugin_dir_url(__FILE__).\'admin/js/jquery.tablesorter.min.js\'
, array(\'jquery\') );
$page=\'admin/p-events/leaders-report.php',
3 => 'case \'course_listing\'           :
wp_enqueue_script(\'courseListingDataTables\' //--- name
//--- location of js file relative to this file
, plugin_dir_url(__FILE__).\'admin/js/DataTables/datatables.min.js\'
, array(\'jquery\') //--- use jquery
);
wp_enqueue_script( \'jquery\' );
$page=\'admin/p-events/list-report.php',
4 => 'case \'course_program\' : $page=\'admin/p-program/courseProgram.php',
),
1 =>
array (
0 => 'course_leaders',
1 => 'courseDifferences',
2 => 'course_leaders_report',
3 => 'course_listing',
4 => 'course_program',
),
2 =>
array (
0 => 'admin/p-members/email-leaders.php',
1 => 'admin/p-events/diff.php',
2 => 'admin/p-events/leaders-report.php',
3 => 'admin/p-events/list-report.php',
4 => 'admin/p-program/courseProgram.php',
),
)
0

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