Проблема регулярных выражений в PHP - PullRequest
1 голос
/ 08 марта 2011

У меня есть строка, в которой я храню страницы книг. Это примерно так:

///0///
Page1 Text
///1///
Page2 Text
///2///
Page3 Text
///3///

Я хочу извлечь текст страницы (Текст страницы1, Текст страницы2, Текст страницы3). Вот регулярное выражение, которое я использую:

$format = "%///\d*///(.*)///\d*///%";
preg_replace_callback($format, "process_page", $text);

Согласно этой странице Я могу использовать другие символы, кроме / в начале и конце выражения. Поэтому я использовал%, чтобы упростить мой шаблон, поэтому мне не нужно использовать escape-символы, подобные этому \ /

Кажется, все в порядке, но ничего не возвращает. Может кто-нибудь сказать, пожалуйста, где проблема?

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Я думаю, вам нужен модификатор s : $format = "%///\d*///(.*)///\d*///%s";

s (PCRE_DOTALL)

Если этот модификатор установлен, метасимвол точкив шаблоне совпадают все символы, включая символы новой строки.Без этого новые строки исключаются.Этот модификатор эквивалентен модификатору Perl's / s.Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от установки этого модификатора.

Я не уверен, что вы пытаетесь сделать, но лично я бы не использовал для этого регулярное выражение.Вы знаете строку точную , которую нужно искать (например, ///4///), и оттуда конечную строку (///5/// или конец файла).Лучше всего использовать простой субстрат с strpos.

2 голосов
/ 08 марта 2011

Я бы использовал что-то вроде preg_spilt (см. Ответ Тима Купера).

Но для вашего RegEx попробуйте это:

$format = "%///\d+///(.*?)(?=///\d+///)%s";

С подтверждением осмотра и s -модификатором.

2 голосов
/ 08 марта 2011

Я думаю preg_split может быть лучшим вариантом для вас:

$text = '
Page1 Text
///1///
Page2 Text
///2///
Page3 Text
';

$format = "%///\d+///%";
$arr = preg_split($format, $text);

// $arr = Array
// ( 
//     [0] => Page1 Text
//
//     [1] => 
// Page2 Text
// 
//     [2] => 
// Page3 Text
// )

Каждая страница теперь находится в своем собственном элементе массива.

...