我想使用preg_replace_callback用标记替换自定义标记的所有实例。例如,我正在使用此代码替换“[tube] ... [/ tube]”的实例:
preg_replace_callback('/\[tube\](.*)\[\/tube\]/', array('MyClass', 'mycallback'), $data);
问题是它不匹配:
[tube]
http://www.somesite.com
[/tube]
我该怎么做?
注意:是的我已经熟悉PECL bbcode扩展以及PEAR库。但我想在没有他们的情况下这样做。
答案 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 )