无法解决这个复杂的正则表达式

时间:2013-03-14 11:25:20

标签: php regex

我有一些例子如下。我需要的是删除特定行中的定时部分。例如来自:

  

Uefa Europa League Simulcast 8.00am-10.00Am

我只需要:

  

欧洲联盟欧洲联盟联播

我是regex的新手。有人可以指导我。

以下是我正在使用的一些示例字符串:

  • Uefa Europa League 8 Simulcast 8.00am-10.00Am
  • 美国职业棒球大联盟:芝加哥白队 - 洛杉矶天使队8.00PM-11.00AM
  • MLB Spring:洛杉矶道奇队的芝加哥小熊队8.00aM-11.00PM
  • Live Test Cricket New am Zealand v England:第二个测试第二天 9:00 am-5:00am
  • 欧足联欧洲联赛Hightlights 10.00pm-11.00pm

3 个答案:

答案 0 :(得分:5)

<?php

$str = array("Uefa Europa League Simulcast 8.00am-10.00Am",
"MLB: Chicago White Sox at Los Angeles Angels 8.00PM-11.00AM",
"MLB Spring: Chicago Cubs at Los Angeles Dodgers 8.00aM-11.00PM",
"Live Test Cricket New Zealand v England: Second Test Day Two 9:00am-5:00am",
"UEFA Europa League Hightlights 10.00pm-11.00pm");


foreach ($str as $s) {
   $new = preg_replace('/\s*\d?\d[\.\:]\d\d[ap]m-\d?\d[\.\:]\d\d[ap]m\s*$/i', '', $s);
   echo "$new\n";
}

输出

Uefa Europa League Simulcast
MLB: Chicago White Sox at Los Angeles Angels
MLB Spring: Chicago Cubs at Los Angeles Dodgers
Live Test Cricket New Zealand v England: Second Test Day Two
UEFA Europa League Hightlights

/\s*\d?\d[\.\:]\d\d[ap]m-\d?\d[\.\:]\d\d[ap]m\s*$/i

的解释
  • \s*表示零个或多个空格
  • \d?表示一位或零位
  • \d表示数字
  • [\.\:]表示.:
  • [ap]表示ap
  • $表示字符串结尾
  • /.../i表示不区分大小写

答案 1 :(得分:1)

不需要正则表达式 - 您可以在最后一个空格处修剪字符串:

<?php

$str = array(
    "Uefa Europa League Simulcast 8.00am-10.00Am",
    "MLB: Chicago White Sox at Los Angeles Angels 8.00PM-11.00AM",
    "MLB Spring: Chicago Cubs at Los Angeles Dodgers 8.00aM-11.00PM",
    "Live Test Cricket New Zealand v England: Second Test Day Two 9:00am-5:00am",
    "UEFA Europa League Hightlights 10.00pm-11.00pm"
);

foreach ($str as $s) {
    $trimmed = substr($s, 0, strrpos($s, ' '));
    echo "$trimmed\n";
}

?>

答案 2 :(得分:1)

正则表达式只匹配常规字符串,所以让我们分解你提供的示例字符串并寻找一些规律性:

8.00am-10.00Am
8.00PM-11.00AM
8.00PM-11.00AM
8.00PM-11.00AM
10.00pm-11.00pm

所以我可以看到:

  • 它始终以一位或两位数字开头。这可以表示为\d{1,2}
  • 后跟点.或冒号:。这可以表示为[.:]
  • 此后总是后跟两位数:\d{2}
  • 然后是字符串AMPM,不区分大小写。要使用不区分大小写,我们可以对整个模式使用i修饰符,因此我们只需要匹配ampm,即(am|pm)。这将表现为捕获组,我们不需要捕获,因此我们可以使用(?:am|pm)(非捕获组)优化表达式
  • 然后短划线-,这可以用字面表示
  • 然后重复模式的第一部分。

所以,当我们把它们放在一起时,我们得到:

/\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i

但等等......这会在主题字符串的末尾留下尾随空格。好吧,我们可以trim()关闭此功能,但我们也可以通过将\s*添加到模式中来获取正则表达式以便为我们处理。

/\s*\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i

所以现在我们只需要用空字符串替换匹配此模式的任何内容。您可以使用preg_replace()

在PHP中执行此操作
$pattern = '/\s*\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i';
$string = 'Uefa Europa League Simulcast 8.00am-10.00Am';

$string = preg_replace($pattern, '', $string);

var_dump($string);

See it working