如何 preg_match 特定的圣经经文并在每个案例中检索书、章节和经文

How to preg_match specific bibles verses and retrieve the book, the chapter and verse in each case

我在 SO 上阅读了很多关于 preg_matching 圣经经文的帖子,但其中 none 似乎符合我的要求。我正在尝试将 以下经文与点 全部匹配 preg_match 并检索书名、章节和经文。

Hebrews 11.6

2 Chronicles 10.16

Romans 13.13

2 Kings 5.10

3 John 1.5

以上诗句恭敬输出

我做到了

if (preg_match('/[ ]{0,}([0-9]{1}[ ]{0,}[a-zA-ZàâäæáãåāèéêëęėēîïīįíìôōøõóòöœùûüūúÿçćčńñÀÂÄÆÁÃÅĀÈÉÊËĘĖĒÎÏĪĮÍÌÔŌØÕÓÒÖŒÙÛÜŪÚŸÇĆČŃÑ]*)[ ]{0,}([0-9]{1,3})[ ]{0,}:[ ]{0,}([0-9]{1,3})[ ]{0,}/', $bible_passage, $ourmatches)) 
    {
        $book = $ourmatches[1];
        
        $chapter = $ourmatches[2];
        
        $verse = $ourmatches[3];
        echo "Book $book chapter  $chapter verse $verse ";

    }

这可以匹配那些经文,但不能用经文单独检索每本书。我想得到以下结果

Book Hebrews Chapter 11 verse 6

Book 2 Chronicles Chapter 10 verse 16

Book Romans Chapter 13 verse 13

Book 2 Kings Chapter 5 verse 10

Book 3 John Chapter 1 verse 5

对于希伯来书 11.6,我得到的是第 1 卷第 1 章第 6 节,而不是希伯来书第 1 章第 6 节

请问如何解决这个问题?

这可能就是您要找的:

<?php
$data = [
    "Hebrews 11.6",
    "2 Chronicles 10.16",
    "Romans 13.13",
    "2 Kings 5.10",
    "3 John 1.5",
];
array_walk($data, function($entry) {
    preg_match('/(?:(\d+)\s+)?(\w+)\s+(\d+)\.(\d+)/', $entry, $capture);
    list($volume, $book, $chapter, $verse) = array_slice($capture, 1);
    echo "Book $book " . ($volume ? "volume $volume " : "") . "chapter $chapter verse $verse\n";
});

输出为:

Book Hebrews chapter 11 verse 6

Book Chronicles volume 2 chapter 10 verse 16

Book Romans chapter 13 verse 13

Book Kings volume 2 chapter 5 verse 10

Book John volume 3 chapter 1 verse 5

您可以使用

<?php

$text = 'Hebrews 11.6
2 Chronicles 10.16
Romans 13.13
2 Kings 5.10
3 John 1.5';
if (preg_match_all('~^(.*?)\h*(\d+)\.(\d+)$~m', $text, $ms, PREG_SET_ORDER, 0)) {
    foreach ($ms as $m) {
        $book=$m[1];
        $chapter=$m[2];
        $verse=$m[3];
        echo "Book $book chapter $chapter verse $verse\n";
    }
}

参见PHP demo, and the regex demo

输出:

Book Hebrews chapter 11 verse 6
Book 2 Chronicles chapter 10 verse 16
Book Romans chapter 13 verse 13
Book 2 Kings chapter 5 verse 10
Book 3 John chapter 1 verse 5

正则表达式详细信息:

  • ^ - 行首(由于 m 标志)
  • (.*?) - 任何文本,尽可能短
  • \h* - 零个或多个水平白色[ace
  • (\d+) - 第 2 组:一个或多个数字
  • \. - 一个点
  • (\d+) - 第 3 组:一个或多个数字
  • $ - 字符串结尾。