3

这里有些例子:

  1. Some text A
  2. Some text A 8:00-19:00
  3. 8:00-19:00
  4. 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

但是我无法通过在模式的末尾添加(.*)或来捕获该行的其余部分。(.*?)

你能帮助我吗?谢谢!

4

4 回答 4

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
)
于 2012-07-30T09:43:14.993 回答
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将包含您需要的所有部分。

编辑:现在也只匹配文本。

于 2012-07-29T17:04:22.137 回答
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 */
}

?>
于 2012-07-29T17:04:55.507 回答
0

好的......我不明白究竟是什么情况。

我相信您想要匹配 3 个可选组(它们可能会匹配“格式错误”的输入,除非您提供您不想匹配的案例场景)。

这适用于所有示例,尽管在案例 1 中,“某些文本 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 ]*?)$/
于 2012-07-29T17:42:55.720 回答