如何匹配诸如重复和包含任何内容的短代码,包括新行


How to match something like shortcode that repeats and contains whatever including new lines

我试图通过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']

演示http://rubular.com/r/7ijXdrhERE