我有一个存储书页的字符串。它是这样的:
///0///
Page1 Text
///1///
Page2 Text
///2///
Page3 Text
///3///
我想提取页面文本(Page1 Text,Page2 Text,Page3 Text)。这是正在使用的正则表达式:
$format = "%///\d*///(.*)///\d*///%";
preg_replace_callback($format, "process_page", $text);
根据this page我可以在表达式的开头和结尾使用除/之外的其他字符。所以我使用%来简化我的模式,所以我不必像这样使用转义字符\ /
对我来说似乎没问题,但它什么也没有回复。有人可以告诉我问题在哪里吗?
答案 0 :(得分:2)
我认为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
// )
每个页面现在都在它自己的数组元素中。
答案 1 :(得分:2)
我认为您需要s
modifier:$format = "%///\d*///(.*)///\d*///%s";
s(PCRE_DOTALL)
如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。此修饰符等效于Perl的/ s修饰符。诸如[^ a]之类的负类始终匹配换行符,与此修饰符的设置无关。
我不确定你要做什么,但我个人不会使用正则表达式。你知道要查找的 exact 字符串(例如///4///
),并从那里结束字符串(///5///
或文件结尾)。带有strpos的simle substr可能是更好的选择。
答案 2 :(得分:2)
我会使用preg_spilt
之类的东西(参见Tim Cooper的回答)。
但是对于你的RegEx,试试这个:
$format = "%///\d+///(.*?)(?=///\d+///)%s";
使用Look-around断言和s
- 修饰符。