如何preg_match特定的圣经经文,并在每种情况下检索书、章节和经文

  • 本文关键字:情况下 检索 match preg 如何 php regex
  • 更新时间 :
  • 英文 :


我在SO上读了很多关于preg_matching圣经经文的帖子,但似乎没有一个符合我的要求。我试图匹配下面的诗句与点所有在一个preg_match和检索书名,章节和诗句。

《希伯来书》

11.6

2 Chronicles 10.16

罗马人

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 ";
}

这可以匹配这些诗句,但不能单独检索每本书的诗句。我想得到以下结果

希伯来书11章6节

Book2 Chronicles第十章第16节

罗马书13章13节

Book2 Kings第五章第十节

Book3 John第一章第五节

希伯来书11章6节我得到的是希伯来书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 $versen";
});

输出为:

希伯来书11章6节

历代志第二卷第十章十六节

罗马书13章13节

列王记第2卷第5章第10节

约翰福音第三卷第一章第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 $versen";
}
}

查看PHP演示,以及正则表达式演示。

输出:

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

Regex细节:

  • ^-行起始(由于m标志)
  • (.*?)-任何文本,尽可能短
  • h*- 0个或多个水平白色[ace
  • ]
  • (d+)-组2:一个或多个数字
  • .- a点
  • (d+)-组3:一个或多个数字
  • $-字符串结束