jkrrv/scripturnum

仅用32位(无符号整数)匹配圣经章节的引用

v2.0.1 2023-11-05 16:11 UTC

This package is auto-updated.

Last update: 2024-09-19 04:09:30 UTC


README

Unit Tests Coverage Status

这是一个用于处理圣经引用的PHP库。它可以解析基于文本的圣经引用,并且可以用仅32位(实际上是31位)来表示圣经章节,这使得圣经的范围可以在大多数数据库中用一个无符号整数存储。

它处理了我们谈论圣经时出现的所有奇怪异常,包括

  • 只有一章的书不会列出章节。(例如,约翰一书11章)
  • 诗篇是单数形式,诗篇是复数形式。(例如,诗篇23篇和诗篇101-102篇)同样,所罗门之歌也是如此。可以通过 'plurl' 选项更改此行为。(拼写错误是故意的--所有选项都是五个字母。)

安装

使用Composer。只需运行

composer require jkrrv/scripturnum
composer install --no-dev

或者,从GitHub下载源代码文件。代码已准备好运行;没有特定的 '构建' 程序。

先决条件

  • PHP >7.0

如果您想运行测试,需要一些其他包,但它们可以通过Composer轻松安装。

限制、限制和注意事项

在这个库中实施了一些限制(只有少数几个),其中大多数与32位能塞入的东西多少有关。具体来说

  1. 范围只能包含在一本书内。所以,“约翰书2-3”是好的。“约翰二书 - 约翰三书”是不行的。
  2. 当起始引用在结束引用之后时,行为是未定义的。在大多数情况下,会抛出异常以防止您这样做,因为“以弗所书2:10-1”实际上没有意义。这种颠倒是不被鼓励的,因为它会使数据库搜索变得非常困难,因为数据库搜索可能会基于位掩码。
  3. 在数据库中存储值时,版本 不能 改变,除非在某些相当狭窄的情况下。
  4. 小心同名书籍,当缩写时可能不会完全表达你的意图。例如,' Ju' 是指《士师记》还是《犹大书》?我们指《犹大书》。'Jg' 指的是《士师记》。

这个库有100%的测试覆盖率,问题通常会被迅速解决。如果您遇到错误,请 在问题跟踪器中报告它

关于版本的说明

从技术角度来看,有一个封闭的版本是 至关重要的,因为章节和书籍是按顺序编号的。如果插入或省略,其余书籍的编号就会错位。

这个库的作者是一位新教徒,他坚持一个由66本书组成的封闭版本,如西方新教主义所列 在此处。更改圣经的版本对保存的任何整数ScripturNums都是灾难性的。

用法

有关完整API文档,请 查看Wiki

引用圣经章节的两种最常见方式可能是,可读的和作为数据库中存储的。构造函数接受这两种形式。

例如

$s = new ScripturNum('Romans 1-8');
var_dump($s);
echo $s;

产生以下结果

object(ScripturNum\ScripturNum)
  protected 'int' => int 738197728
  protected 'book' => int 45
  protected 'startCh' => int 1
  protected 'startV' => int 1
  protected 'endCh' => int 8
  protected 'endV' => int 39
Romans 1-8

或者,从数字开始

$s = new ScripturNum(739119536);
var_dump($s);
echo $s;

产生以下输出

object(ScripturNum\ScripturNum)
  protected 'int' => int 739119536
  protected 'book' => int 45
  protected 'startCh' => int 9
  protected 'startV' => int 1
  protected 'endCh' => int 16
  protected 'endV' => int 27
Romans 9-16

从其他数字引用开始

如果您已经解析了字符串输入并已将数字部分拆分,您可能需要不同的方式。

(马太是第40本书。)

//   ScripturNum::newFromInts($book, $startCh, $startV = 1, $endCh = null, $endV = null)
$n = ScripturNum::newFromInts(40, 8, null, 9);
var_dump($n);
echo $n;

产生以下输出

object(ScripturNum\ScripturNum)[3]
  protected 'int' => int 655134992
  protected 'book' => int 40
  protected 'startCh' => int 8
  protected 'startV' => int 1
  protected 'endCh' => int 9
  protected 'endV' => int 38
Matthew 8-9

获取字符串:全名

对象支持直接转换为字符串。这样做将产生与 getLongString 函数相同的结果。例如

echo new ScripturNum('1Jo1:9')

产生以下输出

1 John 1:9

默认情况下,完整引用使用数字序号(例如2,而不是II或Second),并且是圣经类中名字数组中每个书的 第一个 名称。

获取字符串:缩写

缩写引用可通过 getAbbrev 函数获得。默认情况下,这些缩写用于URL中。因此,它们使用点代替冒号,以避免转义的需求。

echo (new ScripturNum('John 3:16'))->getAbbrev();

产生以下输出

Jn3.16

默认情况下,缩写使用数字序号(例如2,而不是II或Second),并且是圣经类中名字数组中每个书的 第二个 名称。

数据库查询

如果您将 ScripturNum 整数保存到数据库的指定列中,您可以使用位运算符轻松且相对高效地查询它们。为了您的方便,存在两种方法可以生成可以添加到 WHERE 子句的条件:toSqlExclusivetoSqlInclusive。Exclusive 仅包括完全包含在范围内的结果。Inclusive 将包含所有与给定范围重叠的结果,即使它不完全包含在该范围内。

例如,对于名为 "Scripture" 的列,我们可以使用这个

$s = new ScripturNum('Romans 8');
$wheres = $s->toSqlInclusive('Scripture');

此时,$wheres 的值为

( (Scripture & 4278190080) = 738197504 AND (Scripture & 16773120) <= 917504 AND (Scripture & 4095) >= 186 )

因此,我们可以将其插入到查询中

$queryString = "SELECT * FROM scriptureData WHERE $wheres";

$queryString 现在的值为

SELECT * FROM scriptureData WHERE ( (Scripture & 4278190080) = 738197504 AND (Scripture & 16773120) <= 917504 AND (Scripture & 4095) >= 186 )

这可以很容易地用于大多数SQL版本。以下两点注意事项

  • 如果您想使用预处理语句,请注意您将无法重复使用具有不同章节的预处理语句。
  • 由于您无法真正准备语句,请注意SQL注入。在我的应用程序中,我硬编码了列名(或至少将其附加到常量中),这消除了这种风险。但,这可能并不适用于您。

排序

通常,按 ScrupturNum 整数值排序将导致章节按圣经中的相同顺序排列。书籍具有最高优先级,其次是起始章节,然后是起始节,然后是结束章节,最后是结束节。

位运算

ScripturNum 整数只是按顺序排列的数字,按它们各自的位置进行位移动。所有单独的值都是零索引的。创世记是第0本书。创世记1:1的整数值为0。

  • 书籍索引 << 24
  • 起始引用 << 12
  • 结束引用 << 0