将php“genesis 1:3-16”中的字符串拆分为“genesis”,“1”,“3”,“16”

时间:2015-07-27 23:57:13

标签: php regex string split

在php中,当用户保存文本时,我需要将字符串拆分为

“genesis1:3-16”==> “genesis”,“1”,“3”,“16”

“启示2:3-5”==> “启示”,“2”,“3”,“5”

条件是我需要根据符号“:”,“ - ”和字符分割的所有字符之间不会有空格。这些数字最多只能达到'999'3位数。

$sample = "genesis1:3-16";

//magic happens....

$book = "";        // genesis
$chapter = "";     // 1
$start_verse = ""; // 3
$end_verse = "";   //16

我对reg表达的知识有限,并且无法弄清楚只使用strpos和substr ...

提前谢谢

3 个答案:

答案 0 :(得分:1)

我认为这个正则表达式可以实现你的目标:

([a-z]+)(\d{1,3}):(\d{1,3})-(\d{1,3})

演示(解释每个部分的作用):https://regex101.com/r/uP4gW6/1

PHP用法:

preg_match('~([a-z]+)(\d{1,3}):(\d{1,3})-(\d{1,3})~', 'genesis1:3-16', $data);
print_r($data);

输出:

Array
(
    [0] => genesis1:3-16
    [1] => genesis
    [2] => 1
    [3] => 3
    [4] => 16
)

使用preg_match 0索引是找到的内容。后续索引是每个捕获的组。

如果您有一组固定的名称,那么您可以将[a-z]+替换为|分隔的列表,例如revelation|genesis|othername

答案 1 :(得分:0)

$parts = array();

preg_match('/^(.*?)\s*(\d+):(\d+)-(\d+)$/', $sample, $parts);

$book = $parts[1];

$chapter = $parts[2];

$startVerse = $parts[3];

$endVerse = $parts[4];

答案 2 :(得分:0)

你可以使用这个简单的模式

([a-zA-Z]+|\d{1,3})

Demo