PHP正则表达式问题

时间:2011-03-08 16:21:46

标签: php regex pcre

我有一个存储书页的字符串。它是这样的:

///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我可以在表达式的开头和结尾使用除/之外的其他字符。所以我使用%来简化我的模式,所以我不必像这样使用转义字符\ /

对我来说似乎没问题,但它什么也没有回复。有人可以告诉我问题在哪里吗?

3 个答案:

答案 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 - 修饰符。