如果您使用代码,有一种简单的方法可以解决此问题,但通常不赞成使用正则表达式来解析/处理 HTML 或任何标记语言。
首先是模式:
/<b>(.*?)<\/b>/s
这样做会捕获<b> 和下一个</b> 之间的所有内容(不贪婪),包括标签。
完整匹配将是整个字符串(要替换),捕获的组将是要替换它的文本(在代码中稍作修改)。
这样做的方法是获取所有匹配项,然后迭代每个匹配项(从最后一个到第一个),在\n 上爆炸捕获的组,然后用<b> 和</b> 包装每个字符串之前再次使用\n 将其内爆。
用这个结果字符串替换匹配项。这也将处理您已经在同一行上有 <b> 和 </b> 的情况。
PHP 示例:
$string = <<<EOD
<b>Bold Text
Bold Text</b>
Normal Text
Normal Text
<b>Bold Text</b>
EOD;
preg_match_all("/<b>(.*?)<\/b>/s", $string, $matches, PREG_PATTERN_ORDER);
for ($match = count($matches[0]) - 1; $match >= 0; $match--) {
$replace = implode("\n", array_map(function ($str) {
return "<b>".$str."</br>";
}, explode("\n", $matches[1][$match])));
$string = str_replace($matches[0][$match], $replace, $string);
}
echo $string;
将输出:
<b>Bold Text</b>
<b>Bold Text</b>
Normal Text
Normal Text
<b>Bold Text</b>