You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:19:13