2016-12-08 9 views
0

Я пытаюсь извлечь дату из текстовых данных, используя регулярное выражение, но регулярное выражение, которое я использую, ничего не возвращает.Использование регулярного выражения не удалось получить ожидаемый формат даты

РНР код, я использую для извлечения даты из строки:

<?php 
preg_match("/(\w\w\w)\,(\w\w\w) (\d\d)\,(\d\d\d\d) at (\d\d)\:(\d\d) ([A|P]M)/", $input_line, $output_array); 

?> 

ввода строки выборки:

kardashian, kim this is dummy text area 
mercury, freddie Tue, Aug 23, 2016 at 2:21 PM 
22.11.2016 08:58 AM 
last_name, first_name 
bjorge, philip 

Ожидаемый результат:

Tue, Aug 23, 2016 at 2:21 PM 

Пожалуйста, дайте мне знать, почему мое регулярное выражение не работает.

Заранее за вашу помощь.

+1

Обратите внимание на пробелы (вам не хватает одного после первой запятой и у вас слишком много до AM/PM). –

+0

'/ (\ w {3}), (\ w {3}) (\ d {1,2}), (\ d {4}) в (\ d {1,2}): (\ d { 2}) ([AP] M)/'- Короче говоря: ваши пробелы не совпадали, и вы ожидали, что часы будут 2 цифры (это всего лишь 1 в вашем примере,' 2: 21') – ccKep

ответ

0

Вы можете исправить это выражение, добавив подшаблоны для сопоставления пространства, например. \s, что соответствует любому пробелу или \h, который соответствует горизонтальным пробельному только:

/\b(\p{L}{3}),\s(\p{L}{3})\s(\d\d),\s(\d{4})\sat\s(\d\d?):(\d\d)\s([AP]M)/ 
       ^^   ^^  ^^  ^^ ^^     

См regex demo

Везде, где пробельный не является обязательной, добавьте * квантор после него.

Кроме того, чтобы соответствовать Tue, Aug, вы можете использовать шаблон \p{L}{3} (3 буквы). Вместо \d\d\d\d вы можете написать более короткий эквивалент \d{4}. A \b граница слов впереди рекомендуется, так как вам нужно совместить первое трехбуквенное слово как целое слово.

Кроме того, [A|P] матчи A, | или P, вы должны удалить | из класса символов.

 Смежные вопросы

  • Нет связанных вопросов^_^