我需要帮助将PHP的圣经搜索字符串分解为变量或标记。我想得到这篇文章中提供的解决方案的明确用法示例:PHP preg_match bible scripture format。
编辑:章节和经文(从,到)是可选的。
例如:我希望能够拆分以下任何字符串:
'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 problems parsing a bible book string,但我在修改模式时遇到了一些麻烦。我不断得到如下错误:未定义的偏移量:3 ...
感谢您的帮助
答案 0 :(得分:4)
我不会用一个正则表达式做到这一点。
在阅读维基百科中的Bible-citation - Common formats section后,请参阅我的圣经解析器想法:
$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:16
或12 John: 3, 16-17
另见regex faq。
答案 1 :(得分:2)
这里有正则表达式解决方案 我将正则表达式分成多行,因此您更容易理解它。 (我使用命名模式)
$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);
答案 2 :(得分:1)
我一直在使用优秀的库:https://github.com/openbibleinfo/Bible-Passage-Reference-Parser,它可以通过转换为OSIS格式然后能够编写一个简单的RegEx(preg_match)语句来完成您的要求。
在引用的URL的底部,作者引用了“这是我编写的第四个完整的圣经参考解析器。这是我尝试新的编程语言的方式:第一个是PHP(2002),它看到了2002年至2011年圣经搜索网站上的制作用法......“换句话说,如果使用JavaScript / Node.JS不实用,您可以联系作者,看看PHP圣经参考解析器是否是开源的/可用。我还没有遇到它,但它可能在sourceforge或类似的东西那里。
希望有所帮助,
赖安