如何 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 组:一个或多个数字
$
- 字符串结尾。
我在 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 组:一个或多个数字$
- 字符串结尾。