我在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:一个或多个数字$
-字符串结束