要确保正则表达式中的 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 之前不能有其他字母,从而符合您增加的约束条件。
这种写法非常重要!