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


Unable to solve this Complex Regex

我有一些例子如下:我所需要的是去除特定线路上的定时部分。例如from:

欧洲联赛联播8:00 am- 10:00 am

我只需要:

欧洲联赛联播

我不熟悉正则表达式。谁能给我指路?

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

  • 欧洲联赛第8届联播8:00 am- 10:00 am
  • 美国职业棒球大联盟:芝加哥白袜队主场迎战洛杉矶天使队
  • 美国职业棒球大联盟春季赛:芝加哥小熊队对洛杉矶道奇队8:00 - 11:00
  • 现场测试板球新西兰对英格兰:第二次测试两天9:00am-5:00am
  • 欧联杯精彩集锦10:00 pm- 11:00 pm
<?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?表示1位或0位
  • 'd表示数字
  • ['.':]表示.:
  • [ap]表示ap
  • $表示字符串结束
  • /.../i表示不区分大小写

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

<?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";
}
?>

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

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

所以现在我们只需要用一个空字符串替换任何与这个模式匹配的内容。你可以在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);

查看效果