我试图通过preg_replace_callback函数处理类似于shrotcode的东西:
$new_content = preg_replace_callback("|'[BLOCK's?(TYPE=[0-9a-z'/]+)?'s?(TEXT=[a-z]+)?'s?(LAST)?'s?']((?:(?!BLOCK).)*)'['/BLOCK']|","block",$content);
主题($content)如下:
[BLOCK TYPE=1/2 TEXT=right LAST]
<ul><li>something</li>
</ul>
[/BLOCK]
[BLOCK TYPE=1/2 TEXT=right LAST][NEXTSHORTCODE=something][/BLOCK]
[BLOCK TYPE=1/2 TEXT=right LAST]123[/BLOCK]
我遇到了一个问题:
函数preg_replace_callback匹配整个主题(从BLOCK到最后一个/BLOCK),而不是/BLOCK的第一个出现。我想解决它排除字符串BLOCK ((?:(?!BLOCK).)*)从短代码的内部内容,但它不与其他字符如新行等工作
你可以在这里看到我的尝试:http://rubular.com/r/0AqadXVdON
谢谢你的建议,很抱歉我的英语不好。
您需要使用所谓的延迟匹配表达式作为结束标记。
你的正则表达式以'['/BLOCK']
结尾。
尝试以'['/BLOCK']?
结束。这将使它匹配它找到的第一个出现(惰性)而不是最后一个出现(贪婪)。
正如Ollie所说,如果您不关心BLOCK中的TYPE和其他引用,而只想替换所有的BLOCK,那么您可以使用如下简单的方式:
$regex = "~(?s)'[BLOCK.*?/BLOCK]~";
$new_content = preg_replace_callback($regex, $block, $subject);
function block($m) {
// replace magic
return $something;
}
您缺少m
开关。
试试这个代替:
'[BLOCK's?(TYPE=[0-9a-z'/]+)?'s?(TEXT=[a-z]+)?'s?(LAST)?'s?']((?:(?!BLOCK).)*)'['/BLOCK']