如何实现仅对列表标记(如1.、A.、i.等)与冒号间的文本添加粗体
如何实现仅对列表标记(如1.、A.、i.等)与冒号间的文本添加粗体
我完全懂你的需求啦——就是只想给行首的列表标记(比如1.、A.、i.这类)后面到冒号的文本加粗,绝对不能误伤句子中间出现的. ... :结构对吧?你当前的代码之所以会出现误匹配,核心问题在于正则没有限定匹配的位置,导致任何地方符合. ... :格式的内容都会被加粗。
咱们来调整一下正则和代码,完美解决这个问题:
修正后的代码
<script> window.onload = function() { const contentEl = document.getElementById("content"); let text = contentEl.innerHTML; // 修正后的正则:限定匹配行首(含可能的缩进空格)的列表标记 // 匹配三种类型的列表标记:数字点/大写字母点/小写罗马数字点 const pattern = /(^|\s)(\d+\.|[A-Z]\.|[ivxlcdm]+\.)\s*([^:]+?)\s*(?=:)/gmi; text = text.replace(pattern, function(match, leadingSpace, marker, textToBold) { // 保留前置空格,把标记和目标文本一起加粗 return `${leadingSpace}<b>${marker.trim()} ${textToBold.trim()}</b>:`; }); contentEl.innerHTML = text; }; </script>
代码说明
- 正则的关键改进:
(^|\s):确保匹配的是行首或者空格之后的位置(兼容有缩进的列表项)(\d+\.|[A-Z]\.|[ivxlcdm]+\.):精准匹配三种常见列表标记:数字加小数点、大写字母加小数点、小写罗马数字加小数点\s*([^:]+?)\s*:非贪婪匹配标记后到冒号前的文本,自动忽略前后多余空格(?=:):正向预查冒号,确保只匹配冒号前的内容gmi:全局匹配、多行模式(让^匹配每一行的开头)、不区分大小写(兼容罗马数字的大小写写法)
- 替换逻辑优化:把标记和需要加粗的文本合并到一个
<b>标签里,避免重复嵌套,同时保留列表项的缩进空格,保证排版不变。
这样修改后,只会对行首的列表标记到冒号之间的文本加粗,再也不会误伤句子中间的类似结构啦!
备注:内容来源于stack exchange,提问作者Nuel
相关产品推荐
相关产品推荐

