PHP正则表达式无法匹配所有圣经引用问题求助
解决圣经引用正则匹配与链接转换问题
首先得说,你当前的正则表达式确实有语法问题(比如括号嵌套错误、字符类写法不对),而且没覆盖圣经引用的常见格式,咱们一步步来修正。
常见圣经引用格式分析
通常圣经引用的结构是:
- 书卷名(全称或缩写,比如
Genesis/Gen、John/Joh、Matthew/Matt,部分还带数字前缀如1 Corinthians) - 章节号(阿拉伯数字)
- 节号(单个数字,或数字范围如
1-5,如果遇到问号大概率是输入笔误)
修正后的正则表达式
先给你一个能覆盖大多数常见场景的正则:
\b((?:[1-3] )?[A-Za-z]+(?: [A-Za-z]+)?)\b (\d+):(\d+(?:-\d+)?)\b
正则各部分解释:
\b:单词边界,避免匹配到普通句子里的数字组合(比如abc 1:2这种非圣经引用的内容)(?:[1-3] )?:可选的数字前缀(比如1对应1 Corinthians),(?:...)是不捕获的分组,只用来做逻辑判断[A-Za-z]+(?: [A-Za-z]+)?:匹配书卷名,支持单个单词(如John)或多个单词(如1 Corinthians)(\d+):捕获章节号(一个或多个数字)::匹配章节和节之间的冒号(\d+(?:-\d+)?):捕获节号,支持单个数字(如16)或数字范围(如1-3)- 末尾的
\b:确保匹配完整的引用,不会截断内容
如果只需要匹配不带空格的短书卷名(比如Gen、Joh),可以简化成更简洁的版本:
\b([A-Za-z]+) (\d+):(\d+(?:-\d+)?)\b
转换为链接的示例(以JavaScript为例)
假设你要把匹配到的引用转成内部链接,比如链接到/bible/{书卷缩写}/{章节}/{节},可以用replace方法实现:
const originalText = "Lorem ipsum dolor sit amet, John 3:16 sea persius nonumes habemus cu. Eam ferri dicta ex, 1 Corinthians 13:4-7 sit no torquatos reprimique."; const bibleRegex = /\b((?:[1-3] )?[A-Za-z]+(?: [A-Za-z]+)?)\b (\d+):(\d+(?:-\d+)?)\b/g; // 替换为链接,可根据你的实际需求调整URL格式 const linkedText = originalText.replace(bibleRegex, (match, book, chapter, verse) => { // 这里可以加一个书卷名到缩写的映射,比如把John转成Joh const bookAbbr = { "John": "Joh", "1 Corinthians": "1Cor", "Genesis": "Gen" }[book] || book; return `<a href="/bible/${bookAbbr}/${chapter}/${verse}">${match}</a>`; }); console.log(linkedText);
针对你原正则的问题说明
你原来的/([^(])\w+ +\d+:+[\d+[?\-]+([^)])/有几个明显问题:
- 字符类
[\d+[?\-]+写法错误,括号嵌套混乱,应该用分组而非把括号放进字符类里 ([^(])和([^)])会额外捕获引用前后的非(和非)字符,导致匹配结果包含多余内容- 没有处理书卷名带空格或数字前缀的情况,也不支持节号范围
内容的提问来源于stack exchange,提问作者user9729635
相关产品推荐
相关产品推荐

