Многострочное регулярное выражение PHP

У меня есть следующее регулярное выражение PHP

preg_match('/[\/\/\*] First: (.*)\n[\/\/\*] Second: (.*)\n/i', $some_string)

но по какой-то причине он не будет соответствовать этому тексту:

// First: a string
// Second: another string

Я попытался изменить окончания строк между стилями Windows и Unix, ничего не вышло. Я также попытался разделить регулярное выражение, чтобы оно соответствовало первому и второму отдельно; это сработало, но когда я сложил их вместе, они перестали соответствовать образцу текста. Вроде как-то связано с пробелом после второго [\/\/\*] .. есть идеи?

Обратите внимание: я не могу изменить регулярное выражение; это клиентский код, который я изменил, потому что он не предоставляет документации. Этот код ищет определенный шаблон в файлах PHP, чтобы загрузить их как «плагины» в свой продукт. На самом деле я пытаюсь угадать, какой заголовок мне нужно добавить к этим файлам PHP, чтобы они правильно распознавались как плагины.


person Trust    schedule 24.01.2011    source источник


Ответы (3)


Пытаться:

preg_match('~// First: (.*)\n// Second: (.*)~i', $str);

Посмотреть

Почему у вас неправильное регулярное выражение?

[\/\/\*] - это класс символов, который соответствует либо /, либо *.

Но похоже, что у вас в начале строки стоит //, поэтому вы никогда не найдете совпадения.

Какая строка будет соответствовать моему текущему регулярному выражению?

Измените текущий ввод, чтобы иметь / в начале и новую строку после второй строки:

$some_string =
'/ First: a string
/ Second: another string
';

Посмотреть

person codaddict    schedule 24.01.2011
comment
Я не могу изменить само регулярное выражение, это клиентский код, который я не могу изменить. Мне действительно нужно придумать заголовок для плагина php, который будет загружать клиентский код на основе этого правила регулярного выражения .... :( - person Trust; 24.01.2011
comment
@Trust: ваше регулярное выражение просто неверно. Вы ничего не можете сделать, не изменив этого. - person zerkms; 24.01.2011

$some_string = <<<STR
// First: a string
// Second: another string

STR;

$match = preg_match('`// First: (.*)\n// Second: (.*)\n`i', $some_string);

echo $match;

Просто протестировал это, он работает. Вы уверены, что после второй строки стоит разрыв строки?

person mpen    schedule 24.01.2011

(Опубликовано от имени OP).

Отвечать:

Я пытался угадать, с каким образцом это будет совпадать. В итоге получилось так:

/*
* First: a string
* Second: another string
*/
person Community    schedule 01.04.2017