1

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

欧联杯联播 8.00am-10.00am

我只需要:

欧联杯联播

我是正则表达式的新手。有人可以指导我。

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

  • Uefa Europa League 8 联播 8.00am-10.00Am
  • MLB:芝加哥白袜队 - 洛杉矶天使队 8.00PM-11.00AM
  • MLB 春季赛:洛杉矶道奇队的芝加哥小熊队 8.00aM-11.00PM
  • 现场测试板球新西兰对英格兰:第二次测试第二天上午 9:00 至上午 5:00
  • UEFA 欧洲联赛精彩集锦 10.00pm-11.00pm
4

3 回答 3

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表示不区分大小写
于 2013-03-14T11:32:35.080 回答
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";
}

?>
于 2013-03-14T11:38:20.430 回答
1

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

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

所以我可以看到:

  • 它总是以一位或两位数字开头。这可以表示为\d{1,2}
  • 这后跟一个点.或冒号:。这可以表示为[.:]
  • 这总是后跟 2 位数字:\d{2}
  • 然后是字符串AMPM不区分大小写。要使用不区分大小写,我们可以i对整个模式使用修饰符,所以我们只需要匹配amor pm,写成(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

所以现在我们只需要用一个空字符串替换任何匹配这个模式的东西。您可以在 PHP 中使用以下命令执行此操作preg_replace()

$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);

看到它工作

于 2013-03-14T11:38:35.480 回答