正则表达式:如何捕获一个开头,一个模式和一行的结尾?

时间:2012-07-29 16:43:48

标签: php regex

以下是一些例子:

  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
  5. 对于上述每种情况,我需要捕获(如果可能):

    • 时间(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 个答案:

答案 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 ]*?)$/