正则表达式替换用符号包裹的匹配字符串
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>.
我正在尝试弄清楚如何在我的 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>.