preg_match,导致错误的原因是什么?

时间:2013-04-17 13:54:54

标签: php preg-match

所以我试图解析一些内容。它看起来像这样。

## This is a Title ##

- Content will go here, so blah blah blah -

现在我通过php / mysql从表中删除它,并使用preg_match来提取文本。

preg_match('/\##(.*?)\##/', $m_data['field'], $mod_title);
preg_match('/\-(.*?)\-/', $m_data['field'], $mod_content);

这很好用。但是,如果两者中的任何一个都有这样的换行符,我会得到一个php错误。

## This is a 
Title ##

- Content will go here, so blah 
blah blah -

这会导致以下php错误。

 A PHP Error was encountered

 Severity: Notice

 Message: Undefined offset: 1

 Filename: libraries/Functions.php(656) : eval()'d code

 Line Number: 472

我认为它所考虑的偏移是

$title = $mod_title[1];                                              
$content = $mod_content[1];

但是当换行时,数组mod_content为空。

我很确定这是我的正则表达,但我不是它的大师,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

只需在你的正则表达式中添加“s”修饰符:

preg_match('/\##(.*?)\##/s', $m_data['field'], $title);
preg_match('/\-(.*?)\-/s', $m_data['field'], $content);

s(PCRE_DOTALL)

如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。此修饰符等效于Perl的/ s修饰符。诸如[^ a]之类的否定类始终匹配换行符,与此修饰符的设置无关。

有关详情,请参阅:http://php.net/manual/en/reference.pcre.pattern.modifiers.php

答案 1 :(得分:0)

这是因为preg_match与断行不匹配。

解决这个问题的方法是以/ s结束,而不是仅使用/.

所以它会是这样的:

preg_match('/\##(.*?)\##/s', $m_data['field'], $title);
preg_match('/\-(.*?)\-/s', $m_data['field'], $content);