2

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

## 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 是空的。

我很确定这是我的正则表达式,但我不是它的专家,所以任何帮助将不胜感激。

4

2 回答 2

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

于 2013-04-17T14:00:44.450 回答
0

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

解决这个问题的方法是以 /s 结尾,而不是仅仅 /。

所以它会是这样的:

preg_match('/\##(.*?)\##/s', $m_data['field'], $title);
preg_match('/\-(.*?)\-/s', $m_data['field'], $content);
于 2013-04-17T14:05:25.023 回答