解析/爆炸圣经搜索字符串为变量或令牌


PHP Parsing/explode Bible search string into variables or tokens

我需要帮助打破与PHP成变量或令牌圣经搜索字符串。我想得到这篇文章中提供的解决方案的一个明确的使用示例:PHP preg_match圣经经文格式。

编辑:章节和节(from, to)是可选的。

例如:我希望能够拆分以下任何字符串:

'John 14:16–17'; //Book Chapter:FromVerse-ToVerse
'John 14:16'; //Book Chapter:FromVerse
'John 14'; //Book Chapter
'John'; //BOOK

:

<?php
$string = 'Exodus 1:3-7'; // Where Exodus is the book, 1 the chapter number, 3 the starting verse and 7 the ending verse. [Book Chapter:StartVerse-EndVerse]
$pattern = '/[ :-]/';
list( $book, $chapter, $from, $to ) = preg_split($pattern, $string );
echo $book;

允许我获得nbook名称:Exodus。我也可以用同样的方法检索章节号(echo $chapter),等等。

我在这个解决方案中遇到的问题是当书名有多个单词时。例如撒母耳记上3:4-5。例如,如果我使用echo $book,我得到未定义的偏移量3或类似的错误。

上面链接的帖子建议这个正则表达式模式更完整:

/'w+'s?('d{1,2})?(:'d{1,2})?([-–]'d{1,2})?(,'s'd{1,2}[-–]'d{1,2})?+$/

我想我的问题是如何使用这种模式或类似的模式来分割上面描述的搜索字符串。

这里讨论了一个类似的问题:PHP解析圣经书字符串时出现了问题,但是我只是在修改模式时遇到了一些麻烦。我一直得到这样的错误:未定义的偏移:3…

我很感激你的帮助

我不会用一个正则表达式这样做。

在阅读了维基百科的《圣经-引用-常用格式》一节之后,请参阅我的《圣经-解析器》想法:

$holy_str = 'Jonny 5:1,4-5,17,21;';
// split verses from book chapters
$parts = preg_split('/'s*:'s*/', trim($holy_str, " ;"));
// init book
$book = array('name' => "", 'chapter' => "", 'verses' => array());
// $part[0] = book + chapter, if isset $part[1] is verses
if(isset($parts[0]))
{
  // 1.) get chapter
  if(preg_match('/'d+'s*$/', $parts[0], $out)) {
    $book['chapter'] = rtrim($out[0]);
  }
  // 2.) book name
  $book['name'] = trim(preg_replace('/'d+'s*$/', "", $parts[0]));
}
// 3.) verses
if(isset($parts[1])) {
  $book['verses'] = preg_split('~'s*,'s*~', $parts[1]);
}
print_r($book);

输出 (test at eval.in):

Array
(
    [name] => Jonny
    [chapter] => 5
    [verses] => Array
        (
            [0] => 1
            [1] => 4-5
            [2] => 17
            [3] => 21
        )
)

无论在这里,如果John 14:1612 John: 3, 16-17

这里你得到了正则表达式解决方案我把regex分成多行,这样你更容易理解它。(我使用命名模式)

$pattern = 
    "/".
        "(?P<book>'w+)'s?".
        "(".
            "(?P<chapter>'d{1,2})".
            "(".
                ":(?P<fromVerse>'d{1,2})".
                "(".
                    "(–|-)(?P<toVerse>'d{1,2})".
                ")?".
            ")?".
        ")?".
    "/";

或更通用的解决方案

$pattern = 
"/".
    "(?P<book>'w+)'s?".
    "(".
        "(?P<chapter>'d+((–|-)'d+)?)".
        "(".
            ":(?P<verse>(,?'d+((–|-)'d+)?)+)".
        ")?".
    ")?".
"/";
$string = 'Jonny 5:1,4-5,17,21';

$match = null;
preg_match($pattern,$string,$match);
$book = isset($match['book'])?$match['book']:null;
$chapter = isset($match['chapter'])?$match['chapter']:null;
$verses = isset($match['verse'])?explode(',', $match['verse']):null;
var_dump($book, $chapter, $verses);

我一直在使用优秀的库:https://github.com/openbibleinfo/Bible-Passage-Reference-Parser,它可以通过转换为OSIS格式,然后能够编写一个简单的RegEx (preg_match)语句来完成您的要求。

在引用的URL的底部,作者引用"这是我写的第四个完整的圣经参考解析器。"这就是我尝试新的编程语言的方式:第一个是PHP(2002年),从2002年到2011年,它在一个圣经搜索网站上被生产使用……"换句话说,如果使用JavaScript/Node.JS不实际,您可以联系作者,看看PHP圣经参考解析器是否开源/可用。我还没有看到它,但它可能在sourceforge或类似的地方。

希望有帮助,

瑞安