使用 preg_replace() 将简码内容移动到属性中

Moving shortcode content into attribute using preg_replace()

我正在使用以下内容替换短代码的名称:

$content = '[title type="1"]Test[/title]';
$pattern = '#\[title(.*)(.*?)\[/title\]#i';
$replace = '[new_title[/new_title]';
echo preg_replace($pattern, $replace, $content);

这可以很好地改变这个:

[title type="1"]Test[/title]

为此:

[new_title type="1"]Test[/new_title]

但我正在尝试将标签之间的文本移动到属性中并使其自动关闭,如下所示:

[new_title type="1" title="Test"]

使用 /\[(\w+)([^\]]+)](\w+).*/ 作为 preg_replace() 中的模式。在模式 ([^\]]+) select 中,除 ].

之外的每个字符
$newContent = preg_replace("/\[(\w+)([^\]]+)](\w+).*/", '[new_title title=""]', $content)

检查结果 demo

您可以使用

$content = "[title type=\"1\"]Test[/title] [title]Test2[/title]\n [title type=\"6\"]Test With\nNewline 3[/title]";
$pattern = '#\[title(\s.*?)?](.*?)\[/title]#is';
$replace = '[new_title title=""]';
echo preg_replace($pattern, $replace, $content);

参见 this PHP demo and this regex demo。如果您不想匹配其中包含换行符的标题,请删除使 [​​=12=] 匹配换行符的 s 修饰符。

图案详情

  • \[title - [title 子串
  • (\s.*?)? - 匹配 1 次或 0 次出现的可选捕获组
    • \s - 任何空格
    • .*? - 任何 0+ 个字符,尽可能少
  • ] - 一个 ] 字符
  • (.*?) - 捕获第 2 组:任何 0+ 个字符,尽可能少
  • \[/title] - [/title] 子串。