要确保正则表达式中的 A-D
字母前不能有其他字母,我们可以通过负向前瞻(negative lookbehind)来实现这一要求。负向前瞻会检查字母 A-D
之前的内容,确保它前面没有其他字母(即不是字母字符)。
修改后的正则表达式
$question = preg_replace('/(?<![A-Za-z])([A-D])\s*[.、)::]\s*([^<\n]+)/m',
'<span class="option-clickable" data-option="$1">$1. $2<span class="correct-mark">✅</span></span>',
$question);
解释
(?<![A-Za-z])
:这是负向前瞻(negative lookbehind),用于确保A-D
之前没有字母(不论大小写)。[A-Za-z]
:匹配任意字母。(?<!...)
:表示前面不能是指定的内容(在这里是任意字母)。
([A-D])
:匹配字母A
到D
。\s*[.、)::]
:匹配字母后的符号,如.
、、
、)
、:
等,以及可能的空白字符。([^<\n]+)
:匹配选项的内容,直到遇到换行符或 HTML 标签开始字符<
。/m
:多行模式,确保^
和$
能够匹配每一行的开头和结尾。
示例
假设有以下文本:
A. Asynchronous JavaScript And XHR✅
B. Asynchronous jQuery And XML✅
C. Asynchronous JavaScript And XML✅
D. Advanced JavaScript And XML✅
AA. Invalid option
应用修改后的正则表达式后,AA. Invalid option
不会被匹配,因为 A
前面有另一个 A
,而 A
到 D
的其他选项会被正常匹配。
匹配结果:
<span class="option-clickable" data-option="A">A. Asynchronous JavaScript And XHR<span class="correct-mark">✅</span></span>✅
<span class="option-clickable" data-option="B">B. Asynchronous jQuery And XML<span class="correct-mark">✅</span></span>✅
<span class="option-clickable" data-option="C">C. Asynchronous JavaScript And XML<span class="correct-mark">✅</span></span>✅
<span class="option-clickable" data-option="D">D. Advanced JavaScript And XML<span class="correct-mark">✅</span></span>✅
总结
通过使用负向前瞻 (?<![A-Za-z])
,我们确保了 A-D
之前不能有其他字母,从而符合您增加的约束条件。
这种写法非常重要!