2012-07-20 21 views
2

我希望你能幫助我。解析聖經書籍字符串的PHP問題

我有一個像下面

字符串

路1:26-38

而且我希望能夠把它分解成記號或單個變量,這樣我可以在使用變量SQL查詢。

我使用爆炸試過,但我只能夠使它在一個字符爆炸如:或 -

我的字符串有:和 - 也姓名和第一之間的空間數。

我的目標是有:

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

有沒有人能幫助請。

非常感謝

+0

你是如何使用'explode()'所以它沒有工作? – Teneff 2012-07-20 07:25:42

+0

到目前爲止爆炸(「:」,$ data);其中字符串位於變量$ data – user1539953 2012-07-20 07:26:05

+0

以及列表($ book,$ chapter)= explode(「:」,$ data)中; – user1539953 2012-07-20 07:26:34

回答

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 
) 
    */ 
+0

這工作!太棒了 – user1539953 2012-07-20 07:30:23

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

我會放棄這一點。非常感謝 – user1539953 2012-07-20 07:32:13

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)。

+0

我更喜歡這個,對於我在javascript中所做的事情想得太多了 – Esailija 2012-07-20 07:31:20

+0

太棒了,我會試試這個,謝謝你 – user1539953 2012-07-20 07:31:56

+0

你需要修改這段代碼才能支持編號爲聖經(即提摩太前書,提摩太後書等)。 – worsnupd 2012-07-20 07:36:42

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; 
}