正则表达式包括新行

时间:2014-03-07 11:11:23

标签: php regex

当前正则表达式:

"/\[(.*?)\](.+?)\[\/(.*?)\]/"

现在我有以下内容:

[test]textextext[/test] 

它工作正常,但找不到

[test]tesxc
tcxvxcv
[/test]

我该如何解决这个问题?非常感谢帮助。

4 个答案:

答案 0 :(得分:3)

您可以使用/s标记使.与新行匹配。例如:

/\[(\w+)](.+?)\[\/\1]/s

答案 1 :(得分:0)

试试这个

/\[(.*?)\][^.]+\[\/(.*?)\]/

您可以在regexpal.com上测试这些正则表达式

答案 2 :(得分:0)

实际上......单独s旗帜可能不是一个好主意,因为这样可以:

[te
xt]123
456[/tex
t]

我想你可能想要这个:

"(\[(?>([^\]])*)\](.+?)\[/\1\])s"

这使用了一些巧妙的技巧:

  • 开始标记的一次性子模式,可防止可能的回溯爆炸
  • [^\]]*而不是.*?,所以只使用一次的东西效果更好,而且更明确地说明了重复的结果
  • 结束标记使用\1与开始标记相匹配,假设您需要[abc]...[/abc]而不是[abc]...[/def]
  • 使用()代替//来分隔正则表达式 - 括号成对出现,因此无需在内部进行任何转义(您会注意到我在结束标记中只有/模式而不是\/),但这也可以作为一个方便的提醒,匹配数组中的第一个索引是整个匹配。

答案 3 :(得分:0)

只需使用/s修饰符。

参考:

  

s(PCRE_DOTALL)如果设置了此修饰符,则表示中的点元字符   pattern匹配所有字符,包括换行符。没有它,   新线被排除在外。此修饰符等效于Perl's / s   修改。诸如[^ a]的否定类总是匹配换行符   字符,与此修饰符的设置无关。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php