2013-03-14 51 views
1

我有一些像下面這樣的例子。我需要的是刪除特定行中的時間部分。例如來自:無法解決這個複雜的正則表達式

歐足聯歐洲聯賽聯播上午08點,上午10點

我只需要:

歐足聯歐洲聯賽聯播

我是新來的正則表達式。有人能指導我嗎?

以下是我與工作的一些例子字符串:

  • 歐足聯歐洲聯賽8聯播上午08點,上午10點
  • MLB:芝加哥白 - 在洛杉磯天使紅襪8.00PM-11.00
  • MLB春季:在洛杉磯道奇隊上午08點,11.00PM芝加哥小熊
  • 現場測試蟋蟀新的AM新西蘭v英格蘭:第二個測試第二天 9:00 am-5:00am
  • 歐足聯歐洲聯賽海特燈下午10時,下午11時

回答

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指不區分大小寫
+0

它不是爲11.00PM,上午02點的工作?你可以添加這個請 – 2013-03-14 11:44:32

+0

它工作於'11.00PM-2.00AM'(剛剛在我的代碼中試過)。你之前還是之後有空間?編輯考慮到之前或之後的空間...請嘗試新的正則表達式 – 2013-03-14 11:47:06

+0

是的作品,謝謝:) – 2013-03-14 12:11:10

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

?> 
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,不區分大小寫:這可以通過2位被表示爲[.:]
  • 這總是跟隨。要使用不區分大小寫,我們可以在整個模式中使用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); 

See it working

+0

+1這個詳細的解釋:) – 2013-03-14 11:39:29