PHP 将圣经搜索字符串解析/分解为变量或标记

TPM*_*TPM 4 php regex split preg-match

我需要帮助将 PHP 的圣经搜索字符串分解为变量或标记。我想获得这篇文章中提供的解决方案的明确使用示例:PHP preg_match bible scripture format

\n

编辑:章节和诗句(从,到)是可选的。

\n

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

\n
\'John 14:16\xe2\x80\x9317\'; //Book Chapter:FromVerse-ToVerse\n\'John 14:16\'; //Book Chapter:FromVerse\n\'John 14\'; //Book Chapter\n\'John\'; //BOOK\n
Run Code Online (Sandbox Code Playgroud)\n

下列:

\n
<?php\n$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]\n$pattern = \'/[ :-]/\';\nlist( $book, $chapter, $from, $to ) = preg_split($pattern, $string );\necho $book;\n
Run Code Online (Sandbox Code Playgroud)\n

允许我获取 nbook 名称:Exodus。我还可以以同样的方式检索章节号(echo $chapter)等。

\n

我在使用此解决方案时遇到的问题是当书名包含多个单词时。\n示例“1 Samuel 3:4-5”。如果我echo $book得到 offset 3 not Defined 或类似的错误。

\n

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

\n
/\\w+\\s?(\\d{1,2})?(:\\d{1,2})?([-\xe2\x80\x93]\\d{1,2})?(,\\s\\d{1,2}[-\xe2\x80\x93]\\d{1,2})?+$/\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

这里讨论了类似的问题:PHP issues parsing a bible book string,但我只是在修改模式时遇到了一些麻烦。我不断收到如下错误:未定义的偏移量:3 ...

\n

我很感激你的帮助

\n

Jon*_*y 5 5

我不会用一个正则表达式来做到这一点。

在阅读了维基百科中的圣经引文 - 常见格式部分之后,请参阅我的圣经解析器想法:

$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);
Run Code Online (Sandbox Code Playgroud)

输出在 eval.in 进行测试):

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

)
Run Code Online (Sandbox Code Playgroud)

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

另请参阅正则表达式常见问题解答