以下是一些例子:
Some text A
Some text A 8:00-19:00
8:00-19:00
Some text A 8:00-19:00 Some text B
对于上述每种情况,我需要捕获(如果可能):
8:00-19:00
)Some text A
)Some text B
)使用此模式#^(.*?) ?(\d{1,2}:\d{2}-\d{1,2}:\d{2})?$#
,我可以捕获(来自示例2):
Some text A
8:00-19:00
但是我无法通过在模式末尾添加(.*)
或(.*?)
来捕获剩下的行。
答案 0 :(得分:2)
如何使用preg_split?
$tests = array(
'Some text A',
'Some text A 8:00-19:00',
'8:00-19:00',
'Some text A 8:00-19:00 Some text B'
);
foreach ($tests as $test) {
$res = preg_split('/(\d\d?:\d\d-\d\d?:\d\d)/', $test, -1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
print_r($res);
}
<强>输出:强>
Array
(
[0] => Some text A
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
)
Array
(
[0] => 8:00-19:00
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
[2] => Some text B
)
答案 1 :(得分:1)
<?php
$pattern = <<<REGEX
/
(?:
(.*)?\s* #Prefix with trailing spaces
(
(?:\d{1,2}:\d{1,2}-?) #(dd:dd)-?
{2} #2 of those
) #(The time)
\s*(.*) #Trailing spaces and suffix
|
([a-zA-Z ]+) #Either that, or just text with spaces
)
/x
REGEX;
preg_match($pattern, "Some text A 8:00-19:00 Some text B", $matches);
print_r($matches);
数组$matches
将包含您需要的所有部分。
编辑:现在也只匹配文字。
答案 2 :(得分:0)
我认为你的主要问题是你通过在它之后添加?
(我认为你不想要)来使数字组成为可选的。
这适用于我/^(.*) ?(\d{1,2}:\d{2}-\d{1,2}:\d{2}) ?(.*)$/
:
<?
$str = "Some text A 8:00-19:00 Some text B";
$pat = "/^(.*) ?(\d{1,2}:\d{2}-\d{1,2}:\d{2}) ?(.*)$/";
if(preg_match($pat, $str, $matches)){
/*
Cases 2, 3 and 4
Array
(
[0] => Some text A 8:00-19:00 Some text B
[1] => Some text A
[2] => 8:00-19:00
[3] => Some text B
)
*/
}else{
/* Case 1 */
}
?>
答案 3 :(得分:0)
好的......我不明白究竟是什么情况。
我相信您希望匹配3个可选组(可能与“格式错误”输入相匹配,除非您提供了您不想匹配的案例场景)。
这适用于所有示例,但在案例1中,“Some text A”出现在$ matches [0]和$ matches [3]而不是$ matches [1]。
/^([A-Za-z ]*?)([0-2]{0,1}[0-9]\:[0-6][0-9]\-[0-2]{0,1}[0-9]\:[0-6][0-9])?([A-Za-z ]*?)$/