jkrrv / scripturnum
仅用32位(无符号整数)匹配圣经章节的引用
Requires (Dev)
- ext-sqlite3: *
- php-coveralls/php-coveralls: *
- phpunit/phpunit: >=5.0
- skayo/phpdoc-md: dev-master
This package is auto-updated.
Last update: 2024-09-19 04:09:30 UTC
README
这是一个用于处理圣经引用的PHP库。它可以解析基于文本的圣经引用,并且可以用仅32位(实际上是31位)来表示圣经章节,这使得圣经的范围可以在大多数数据库中用一个无符号整数存储。
它处理了我们谈论圣经时出现的所有奇怪异常,包括
- 只有一章的书不会列出章节。(例如,约翰一书11章)
- 诗篇是单数形式,诗篇是复数形式。(例如,诗篇23篇和诗篇101-102篇)同样,所罗门之歌也是如此。可以通过 'plurl' 选项更改此行为。(拼写错误是故意的--所有选项都是五个字母。)
安装
使用Composer。只需运行
composer require jkrrv/scripturnum
composer install --no-dev
或者,从GitHub下载源代码文件。代码已准备好运行;没有特定的 '构建' 程序。
先决条件
- PHP >7.0
如果您想运行测试,需要一些其他包,但它们可以通过Composer轻松安装。
限制、限制和注意事项
在这个库中实施了一些限制(只有少数几个),其中大多数与32位能塞入的东西多少有关。具体来说
- 范围只能包含在一本书内。所以,“约翰书2-3”是好的。“约翰二书 - 约翰三书”是不行的。
- 当起始引用在结束引用之后时,行为是未定义的。在大多数情况下,会抛出异常以防止您这样做,因为“以弗所书2:10-1”实际上没有意义。这种颠倒是不被鼓励的,因为它会使数据库搜索变得非常困难,因为数据库搜索可能会基于位掩码。
- 在数据库中存储值时,版本 不能 改变,除非在某些相当狭窄的情况下。
- 小心同名书籍,当缩写时可能不会完全表达你的意图。例如,' 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
子句的条件:toSqlExclusive
和 toSqlInclusive
。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