PHP正则表达式添加空间

PHP正则表达式添加空间,php,regex,Php,Regex,我有以下字符串: John 1:9 以及以下php代码: $parts = preg_split('/[^a-z]/i', $a,2); var_dump($parts); 它返回以下结果(如我所料) 然而,我可能想要《约翰一书1:9》这本书,它无法检测《约翰一书》。如何更改正则表达式代码以接受数字1-4和书名前的空格?如何: preg_match('/^((?:\d{1,4} )?\S+) (.+)$/', $string, $matches); 图书名称(带有可选编号)在$matche

我有以下字符串:

John 1:9
以及以下php代码:

$parts = preg_split('/[^a-z]/i', $a,2);
var_dump($parts);
它返回以下结果(如我所料)

然而,我可能想要《约翰一书1:9》这本书,它无法检测《约翰一书》。如何更改正则表达式代码以接受数字1-4和书名前的空格?

如何:

preg_match('/^((?:\d{1,4} )?\S+) (.+)$/', $string, $matches);

图书名称(带有可选编号)在
$matches[1]
中,其余的在
$matches[2]

中,而不仅仅是拆分,然后您需要编写一个正则表达式来匹配每个部分

您可以使用以下内容:

/^((?:[1-4] )?[a-z]+) ([\d:]*)$/
然后使用
preg\u match
如下:

preg_match('/^((?:[1-4] )?[a-z]+) ([\d:]*)$/', $string, $parts);

我认为最简单的方法是检查第一个结果是否为数字,如果是,则连接前两个键

$parts = preg_split('/[^a-z]/i', $a);
if (is_numeric($parts[0])) {
    $parts[0] = array_shift($parts) . ' ' . $parts[0];
}
var_dump($parts);

你说的书名是什么意思?你的输入和预期输出是什么?“约翰”是圣经中的书名,但也可以是“约翰一书”,这是另一个书名。还有例如《哥林多前书》。圣经中的书名,前面有一个数字。
preg_split('/([1-4])?\s?[A-zA-Z],$A,2)应该帮你分类:)解释:“它可能有1到4的数字,可能有空格,当然还有从a到z的字母,包括大写字母”
$parts = preg_split('/[^a-z]/i', $a);
if (is_numeric($parts[0])) {
    $parts[0] = array_shift($parts) . ' ' . $parts[0];
}
var_dump($parts);