0

谁能帮助我如何将 /explode verse 格式拆分为 3 个部分?

条件应该如下。

第二部分和第三部分必须用冒号分隔。例如在创 1:1

它必须分开为

[0] = Gen
[1] = 1
[2] = 1

它由一个空格(或多个空格以使其用户友好)和冒号分隔

其次,在前面有数字的经文中是一个问题,因为用户可以将其键入为

1 Cor 1:1 他们也可以将其输入为 1Cor 1:1

在任何一种情况下,我都希望 [1] 和 [2] 用冒号分隔,其余部分将被修剪所有空间并成为 [0] 值。

这可能吗?因为我正在考虑只使用一个文本框来搜索诗句,php 会在将其作为查询传递之前相应地对其进行验证。

谢谢

4

4 回答 4

1

我想出了以下似乎可行的模式。试试这个:

<?php

$string = '7 Genesis 16:23';

if (preg_match('/^(.*?)\s+(\d+):(\d+)$/', $string, $match)) {
    echo "You selected book {$match[1]}, chapter {$match[2]}, verse {$match[3]}!";
} else {
    echo "I couldn't understand your input.  Please use 'Book chapter:verse' format.";
}

表达式的第一部分(.*?)与书相匹配,(1 Cor) 或只是 (Cor),因此您可能需要/想要对该部分进行额外验证或改进它,但这对我来说没问题。希望能让你开始。

于 2012-06-13T00:29:02.090 回答
0

尝试这样的事情:

$str = 'Gen 1:1'; // OR: $str = '1 Cor 1:1';
$array = explode( ' ', $str);
$last = end( $array);
$array = array_merge( array_slice( $array, 0, count( $array) - 1), explode( ':', $last));
var_dump( $array);

演示

于 2012-06-13T00:29:01.937 回答
0

这种模式应该有效:

$subject = <<verse here>>;
$pattern = '/^([0-9a-zA-Z ]+) ([0-9]+):([0-9]+)/';
preg_match($pattern, $subject, $matches);
print_r($matches);

请注意,第一个元素$matches将是完整的 $subject。元素 1-3 将映射到您的元素 0-2。

于 2012-06-13T00:30:55.850 回答
0

所以听起来你想要以下内容,按顺序:

  • 一些文字(也许空格也许不是)(.*)
  • 一些空格(至少 1 个)[ ]+
  • 一个数字(1+ 位)([0-9]+)
  • 一个冒号:
  • 另一个数字(1+ 位)([0-9]+)

因此,您的正则表达式看起来像这样:

/^(.*)[ ]*([0-9])+:([0-9]+)$/

运行后:

$m = '1 Cor 3:14';
$matches = array();
preg_match("/^(.*)[ ]*([0-9])+:([0-9]+)$/", $m, $matches); 

$matches看起来像这样:

Array
(
    [0] => 1 Cor 3:14
    [1] => 1 Cor 
    [2] => 3
    [3] => 14
)
于 2012-06-13T00:32:44.673 回答