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

时间:2018-10-04 08:51:29

标签: php regex string preg-replace

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

$content = '[title type="1"]Test[/title]';
$pattern = '#\[title(.*)(.*?)\[/title\]#i';
$replace = '[new_title$1[/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"]

2 个答案:

答案 0 :(得分:2)

您可以使用

$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$1 title="$2"]';
echo preg_replace($pattern, $replace, $content);

请参见this PHP demothis regex demo。如果您不想匹配标题中包含换行符的标题,请删除使s匹配换行符的.修饰符。

模式详细信息

  • \[title-一个[title子字符串
  • (\s.*?)?-匹配1个或0个匹配项的可选捕获组
    • \s-任意空格
    • .*?-任意0个以上的字符,尽可能少
  • ]-一个]字符
  • (.*?)-捕获第2组:任意0个以上的字符,并且数量尽可能少
  • \[/title]-[/title]子字符串。

答案 1 :(得分:0)

使用/\[(\w+)([^\]]+)](\w+).*/作为preg_replace()中的模式。在模式([^\]]+)中,选择除]以外的所有字符。

$newContent = preg_replace("/\[(\w+)([^\]]+)](\w+).*/", '[new_title$2 title="$3"]', $content)

demo中查看结果