2013-05-20 3 views
0

У меня есть пользовательская форма, где я позволяю пользователю вводить дату. У меня есть функция, которая преобразует вход пользователя в метку времени. Но единственным форматом, который он может обрабатывать, является mm/dd/yyyy. Итак, как я могу преобразовать любого из них:php regex modifying string

m/dd/yyyy, 
m/d/yyyy, 
mm/d/yyyy 
with any separator might that be 
(/,\,-,space) 

в принятой маску моей функции в той мм/дд/гггг?

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

preg_match_all("[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}", $string,$matches); 

Но всему это я получаю ошибка

(неизвестный модификатор "}"),

Кто-нибудь знает, что случилось? Это моя первая попытка с использованием регулярного выражения.

ответ

2

Вы получаете ошибку, потому что не используете разделители Regex.

Оно должно быть:

preg_match_all("#[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}#", $string,$matches); 

Это, конечно, не поможет решить исходную задачу, но просто говорит вам, что вы должны использовать регулярное выражение в ограничителях вашего выбора, как /, #, ~, | и т.д.

Подсказка: Для разбора даты в различных форматах смотрите в strototime PHP function.

2

Нет необходимости использовать регулярное выражение для этого (на самом деле это потребует больше работы). Использование PHP встроенный даты/времени функций вместо:

strtotime: преобразует строку даты (практически любого формата) в Отметка времени Unix

date: форматирует метку времени в человеко-читаемом даты

$user_date;    #the user-supplied date, any format 
$format = 'm/d/Y';  #your desired date format, in this case MM/DD/YYYY 

#convert the date to your format 
$formatted_date = date($format, strtotime($user_date)); 

Или вы можете сделать это с помощью объекта DateTime. Учитывая $user_date и $format из вышеизложенного:

$user_date_obj = new DateTime($user_date); 
$formatted_date = $user_date_obj->format($format); 

или

$formatted_date = date_format(date_create($user_date), $format); 

..

Все, что сказал, чтобы ответить на ваш вопрос, просто разграничить ваше регулярное выражение. Slashes будет работать, но так как вы соответствующие буквенные косой черты внутри регулярных выражений, то проще использовать что-то другое, скажем, бары/трубы:

preg_match_all("|[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}|", $string, $matches); 

Таким образом, вам не нужно, чтобы избежать ваших слэш литералов.

Кстати, вы также можете сократить это регулярное выражение:

"|(\d{0,2}/){2}\d{4}|" 

\d таким же, как [0-9], и вы можете объединить два вхождение \d{0,2}/ в (\d{0,2}/){2}. Некоторым может показаться, что это труднее читать.

1

Я не думаю, что регулярное выражение - это то, как вы хотите это сделать. Попробуйте использовать объект DateTime в PHP, как это:

$objDate = new DateTime($strDate); 
$strNewDate = $objDate->format('m/d/Y'); 
1

Вы должны сделать две вещи:

  1. нуждается Это выражение будет отформатирован как: DELIMITERрегулярное выражениеDELIMITERPARAMS

    например, /регулярных выражений/PARAMS

  2. побег символы-ограничители при необходимости

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

preg_match_all("/[0-9]{0,2}\/[0-9]{0,2}\/[0-9]{4}/", $string, $matches); 
+0

хотя ваше решение будет работать, ваши рассуждения совершенно неправильны: косые черты не являются метасимволами регулярных выражений, поэтому их нужно избегать, если в качестве разделителя регулярных выражений используются косые черты. но вы можете использовать практически любую пару символов, которые вы хотите использовать как разделители, даже метасимволы регулярных выражений, такие как '||', '[]', '{}', '@@' или даже 'aa'. – sgroves

+0

Да «/» - не единственный, но самый распространенный разделитель, поэтому я его и использовал. Он используется на других языках с использованием PCRE. http://php.net/manual/en/regexp.reference.delimiters.php – rPawel

+0

Я знаю это. ваш ответ по-прежнему неточный. OP не «нужно» делать одну из двух вещей, которые вы сказали, что им нужно делать, поэтому я прокомментировал. – sgroves