如何正则表达式替换标签后跟换行符?

时间:2011-04-29 04:26:15

标签: php regex

我想使用preg_replace_callback用标记替换自定义标记的所有实例。例如,我正在使用此代码替换“[tube] ... [/ tube]”的实例:

preg_replace_callback('/\[tube\](.*)\[\/tube\]/', array('MyClass', 'mycallback'), $data);

问题是它不匹配:

[tube]
http://www.somesite.com
[/tube]

我该怎么做?

注意:是的我已经熟悉PECL bbcode扩展以及PEAR库。但我想在没有他们的情况下这样做。

2 个答案:

答案 0 :(得分:2)

您必须使用模式修饰符。

  

s(PCRE_DOTALL)如果此修饰符是   设置,一个点元字符   模式匹配所有字符,   包括换行符。没有它,   新线被排除在外。这个修饰语   相当于Perl的/ s修饰符。一个   负面的类,如[^ a]总是   匹配换行符,   独立于此的设定   改性剂。

preg_replace_callback('/\[tube\](.*)\[\/tube\]/smU', array('MyClass', 'mycallback'), $data);

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

答案 1 :(得分:1)

您现在不匹配行尾字符,请尝试使用

Pattern: \[tube\]\s([^\s]*)\s\[/tube\]

编辑:以下是我的代码(preg_match()使用与preg_replace_callback()相同的匹配库

$val = '[tube]
http://www.somesite.com
[/tube]';

preg_match('|\[tube\]\s([^\s]*)\s\[/tube\]|', $val, $matches);
print_r($matches);

输出:

Array ( [0] => [tube] http://www.somesite.com [/tube] [1] => http://www.somesite.com )