我希望你能帮助我。
我有一个类似以下的字符串
Luke 1:26-38
我希望能够将其分解为令牌或单个变量,以便在SQL查询中使用这些变量。
我试过使用爆炸,但我只能让它在一个角色上爆炸,比如:或-
我的字符串有:和-,名字和第一个数字之间还有一个空格。
我的目标是拥有:
$name = Luke;
$book = 1;
$from = 26;
$to = 38;
有人能帮忙吗。
非常感谢
您可以通过简单的字符串扫描(Demo):
$r = sscanf("Luke 1:26-38", "%s %d:%d-%d", $name, $book, $from, $to);
变量包随后包含信息。%s
表示字符串(不含空格),%d
表示小数。参见sscanf
。
为了使这个"圣经安全",它需要一些额外的修改:
$r = sscanf($string, "%[ a-zA-Z] %d:%d-%d", $name, $book, $from, $to);
$name = trim($name);
(第二个演示)。
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
)
*/
$string = "Luke 1:26-38";
preg_match('#^('w+)'s('d+):('d+)-('d+)$#', $string, $result);
print_r($result);
regex很难配置,因为圣经书名、章节和诗句编号有多种配置。因为有些书以数字开头,有些书的书名中有多个空格。
我想到这个是为了构建一个sql查询,它适用于这些段落搜索类型。。(约翰福音)、(约翰福音3章)、(约3:16)、(帖前1章1节)
书名可以是三个字母的缩写。
进行无限制的单个单词搜索和精确短语。
$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;
}