解析圣经书籍字符串的PHP问题

时间:2012-07-20 07:22:43

标签: php string parsing variables explode

我希望你能帮助我。

我有一个像以下

的字符串 路加福音1:26-38

我希望能够将其分解为令牌或单个变量,以便我可以在SQL查询中使用变量。

我尝试过使用爆炸,但是我只能在一个角色上爆炸,例如:或 -

我的字符串有:和 - 以及名称和第一个数字之间的空格。

我的目标是:

    $name = Luke;
    $book = 1;
    $from = 26;  
    $to = 38;

有人能帮忙吗。

非常感谢

4 个答案:

答案 0 :(得分:8)

您可以通过简单的字符串扫描(Demo):

来实现
$r = sscanf("Luke 1:26-38", "%s %d:%d-%d", $name, $book, $from, $to);

然后,varibales包含信息。 %s表示一个字符串(不含空格),%d表示小数。请参阅sscanf


为了使这个“圣经安全”,它需要一些额外的修改:

$r = sscanf($string, "%[ a-zA-Z] %d:%d-%d", $name, $book, $from, $to);
$name = trim($name);

Second demo)。

答案 1 :(得分:3)

list( $name, $book, $from, $to ) = preg_split( '/[ :-]/', 'Luke 1:26-38' );

echo $name; //"Luke"

    /* Split results in an Array
(
    [0] => Luke
    [1] => 1
    [2] => 26
    [3] => 38
)
     */

答案 2 :(得分:2)

$string = "Luke 1:26-38";
preg_match('#^(\w+)\s(\d+):(\d+)-(\d+)$#', $string, $result);
print_r($result);

答案 3 :(得分:0)

正则表达式很难为此配置,因为圣经书名,章节和经文的多种配置。因为有些书以数字开头,有些书在书名中有多个空格。

我想出了这个用于构建SQL查询,它适用于这些段落搜索类型.. (约翰),(约翰福音3),(约翰福音3:16),(帖撒罗尼迦前书1:1)

书名可以是3个字母的缩写。

无限制的单词搜索和精确短语。

$string = $_GET['sstring'];
$type = $_GET['stype'];
switch ($type){ 
    case "passage":
        $book = "";
        $chap = "";
        $stringarray = explode(':', $string); // Split string at verse refrence/s, if exist.
        $vref = $stringarray[1]; 
        $vrefsplit = explode('-', $vref);// Split verse refrence range, if exist.
        $minv = $vrefsplit[0];
        $maxv = $vrefsplit[1]; // Assign min/max verses.
        $bc = explode(" ", $stringarray[0]); // Split book string into array with space as delimiter.
        if(is_numeric($bc[count($bc)-1])){ // If last book array element is numeric?
            $chap = array_pop($bc); // Remove it from array and assign it to chapter.
            $book = implode(" ", $bc); // Put remaining elemts back into string and assign to book.
        }else{
            $book = implode(" ", $bc); // Else book array is just book, convert back to string.
        }
        // Build the sql query.
        $query_rs1 = "SELECT * FROM kjvbible WHERE bookname LIKE '$book%'";
        if($chap != ""){
            $query_rs1.= " AND chapternum='$chap'";
        }
        if($maxv != ""){
            $query_rs1.= " AND versenum BETWEEN '$minv' AND '$maxv'";
        }else if($minv != ""){
            $query_rs1.= " AND versenum='$minv'";
        }
    break;
    case "words":
        $stringarray = explode(" ", $string); // Split string into array.<br />
        // Build the sql query.
        $query_rs1 = "SELECT * FROM kjvbible WHERE versetext REGEXP '[[:<:]]". $stringarray[0] ."[[:>:]]'";
        if(count($stringarray)>1){
            for($i=1;$i<count($stringarray);$i++){
                $query_rs1.= " AND versetext REGEXP '[[:<:]]". $stringarray[$i] ."[[:>:]]'";
            }
        }
    break;
    case "xphrase":
        // Build the sql query.
        $query_rs1 = "SELECT * FROM kjvbible WHERE versetext REGEXP '[[:<:]]". $string ."[[:>:]]'";
    break;
    default :
    break;
}