正则表达式替换用符号包裹的匹配字符串

Matching String Wrapped In Symbol For Regex Replace

我正在尝试弄清楚如何在我的 WordPress 博客上实施正则表达式。

问题

我想用一些内联样式替换某些内容,我正在使用 Regex 来完成此操作。

我的想法如下:找到包裹在特定符号中的字符串,即“~string~”,并用具有特定 class.

的跨度动态替换它

我想要获得与 SO 的内联 code 突出显示功能类似的效果,但我没有使用反引号,而是使用“~”作为我选择的符号(因为 WordPress 已经识别“`”作为代码)。

快速示例

原文

This is a demo paragraph with a wrapped string ~here~, with another string ~~here~~.

正则表达式替换后

This is a demo paragraph with a wrapped string <span class="classOne">here</span>, with another string <span class="classTwo">here</span>.

我在挣扎什么

我使用的正则表达式是:/~(.*?)~/,它可以很好地查找诸如“~demo~”之类的字符串,但我不确定如何将它扩展到能够找到具有多个分隔符的字符串,例如:“~~demo~~”。

对我来说棘手的部分是它需要区分一个“~”和两个“~”,因为我想为每个结果分配不同的替换。

如有任何帮助,我们将不胜感激!提前致谢。

为了让它更通用一些,你可以试试这个 (~+)([^~]+?)(~+)。这将需要额外检查匹配 (~) 的第一个或第三个分组中存在的字符数。根据字符数决定 classOne、classTwo、classThree 等的代码...

您可以使用

~~([\s\S]*?)~~(?!~)|~([^~]*)~

regex demo。详情:

  • ~~([\s\S]*?)~~(?!~) - ~~,然后是匹配任何零个或多个字符但尽可能少的捕获组 #1,然后是一个 ~~ 子字符串,后面没有另一个 ~ 字符
  • | - 或
  • ~([^~]*)~ - ~,然后是捕获组 #2 匹配 ~ 以外的零个或多个字符,然后是 ~

如果您在 PHP 中使用它,您可以使用带有 preg_replace_callback 的模式,您可以在匹配特定捕获组时定义单独的替换逻辑。

看到一个PHP demo:

$html = 'This is a demo paragraph with a wrapped string ~here~, with another string ~~here~~.';
echo preg_replace_callback('/~~([\s\S]*?)~~(?!~)|~([^~]*)~/', function ($m) {
    return !empty($m[1]) ? '<span class="classTwo">' . $m[1] . '</span>' : '<span class="classOne">' . $m[2] . '</span>';
},$html);
// => This is a demo paragraph with a wrapped string <span class="classOne">here</span>, with another string <span class="classTwo">here</span>.