Мне нужно захватить каждое определение случая и затем связанное с ним имя файла 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`
В PHP подстановочный знак .
не включает переводы строк. Итак, включите их сами:
case [\"|\'](.*?)[\"|\'](.|\n)+?=[\s|\"|\'](.*?\.php)
Обратите внимание на изменение в середине: .*
в (.|\n)+?
что делает квантификатор ленивым.
Или, как указывает @TimBiegeleisen в комментариях, вы можете добавить флаг s
запустить регулярное выражение в dot all
Режим:
/case [\"|\'](.*?)[\"|\'].+?=[\s|\"|\'](.*?\.php)/gs
Обратите внимание, что вам все еще нужно добавить ?
в квантификатор, чтобы сделать его ленивым.
Шаблон: ~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
на самом деле повышает эффективность из-за ленивого сопоставления точек перед ним.Код: (демонстрация)
$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',
),
)