首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP解析/爆炸圣经搜索字符串到变量或标记

PHP解析/爆炸圣经搜索字符串到变量或标记
EN

Stack Overflow用户
提问于 2014-05-18 07:59:10
回答 3查看 1.3K关注 0票数 4

我需要帮助使用PHP将圣经搜索字符串分解为变量或标记。我想得到本文中提供的解决方案的一个显式用法示例:匹配圣经经文格式

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

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

代码语言:javascript
复制
'John 14:16–17'; //Book Chapter:FromVerse-ToVerse
'John 14:16'; //Book Chapter:FromVerse
'John 14'; //Book Chapter
'John'; //BOOK

以下内容如下:

代码语言:javascript
复制
<?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的名字:出逃。我还可以以相同的方式检索章节号(echo $chapter),等等。

这个解决方案的问题是,当书名有多个单词时。例子'1 Samuel 3:4-5‘。例如,如果我echo $book,就会得到未定义的偏移量3或类似的错误。

在上面链接的帖子中指出,这个regex模式更完整:

代码语言:javascript
复制
/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?+$/

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

这里也讨论了一个类似的问题:解析圣经中的图书字符串时遇到PHP问题,但我只是在修改模式时遇到了一些困难。我不断犯错误,比如:未定义的偏移量:3.

我很感谢你的帮助

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-18 10:01:00

我一次也不会这么做。

在维基百科上阅读了圣经.引文.通用格式部分之后,请参阅我的圣经解析器的想法:

代码语言:javascript
复制
$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);

输出(eval.in测试):

代码语言:javascript
复制
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常见问题

票数 5
EN

Stack Overflow用户

发布于 2014-05-18 10:18:03

这里有regex解决方案,我将regex拆分成多行,这样您就更容易理解它了。(我使用命名模式)

代码语言:javascript
复制
$pattern = 
    "/".
        "(?P<book>\w+)\s?".
        "(".
            "(?P<chapter>\d{1,2})".
            "(".
                ":(?P<fromVerse>\d{1,2})".
                "(".
                    "(–|-)(?P<toVerse>\d{1,2})".
                ")?".
            ")?".
        ")?".
    "/";

或者更通用的解决方案

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2014-12-17 21:17:38

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

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

希望能帮上忙

瑞安

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23719791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档