feat: PubMed搜索合规审计 Phase 5-7 全部修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s

P1-2: [SB][STAT][UID][DEP][MESH]字段支持
P1-4: [MH:noexp]解析+抑制树展开
P3: 前端date_to/P3-1、CJK高亮/P3-3、extractPlainText/P3-4、precision_mode移除/P3-6、loadMore sort/P3-5
P4-1: 词数上限50→100
P4-2: retracted参数清理
This commit is contained in:
34047007@qq.com
2026-07-27 09:03:19 +08:00
parent 62ca8fa6b8
commit 5f69277eba
7 changed files with 111 additions and 30 deletions
@@ -111,8 +111,11 @@ const nctId = computed(() => {
// 从查询中提取纯文本词(去掉 PubMed 字段标签如 [TI]、[AB] 等)
function extractPlainText(q: string): string {
return q
.replace(/\[[\w-]+\]/g, '')
.replace(/"?\b(AND|OR|NOT)\b"?/gi, '')
.replace(/\[[\w-]+\]/g, '') // [field tags]
.replace(/"?\b(AND|OR|NOT)\b"?/gi, '')// boolean operators
.replace(/[()]/g, '') // P3-4: 去掉括号
.replace(/#\d+/g, '') // P3-4: 去掉 #N 引用标记
.replace(/\*/g, '') // P3-4: 去掉通配符
.replace(/"/g, '')
.replace(/\s+/g, ' ')
.trim()
@@ -127,8 +130,9 @@ const highlightedTitle = computed(() => {
const terms = plain.split(/\s+/).filter(t => t.length > 0)
if (terms.length === 0) return ''
const escaped = terms.map(t => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
// 单字符词添加 \b 词边界避免过匹配("A" 不匹配每个字母 "a"
const pattern = escaped.map(e => e.length === 1 ? `\\b${e}\\b` : e).join('|')
// P3-3: 单字符词添加 \b 词边界,但 CJK 字符跳过(\b 对 CJK 无效
const isCJK = (c: string) => /[-鿿㐀-䶿豈-﫿]/.test(c)
const pattern = escaped.map(e => e.length === 1 && !isCJK(e) ? `\\b${e}\\b` : e).join('|')
const parts = title.split(new RegExp(`(${pattern})`, 'gi'))
return parts.map((part: string) =>
terms.some(t => part.toLowerCase() === t.toLowerCase())