2010-09-30 4 views
4

Я пытаюсь соответствовать дате в PHP с использованием preg_match, разделить его и назначить его части в массив, дата выглядит как «20100930», вот код, я использую:preg_match на свидание

// Make the tor_from date look nicer 
$nice_from = $_POST['tor_from']; 

$matches = array(); 
$ideal_from = ''; 
preg_match('/\d{4}\\d{2}\\d{2}\/', $nice_from, $matches, PREG_OFFSET_CAPTURE, 0); 
// if (isset($matches[0])) $nice_from = $matches[0]; 
echo $matches[0]; 
echo "<br />"; 
echo $matches[1]; 
echo "<br />"; 
echo $matches[2]; 
echo "<br />"; 
echo $matches[3]; 
echo "<br />"; 

Ive использовал: http://php.net/manual/en/function.preg-match.php и PHP preg_match question, чтобы сформулировать идеи о том, как это сделать, однако мне не удалась заставить его работать. Любая помощь будет принята с благодарностью.

ответ

1

Regex - не лучший способ пойти сюда, если шаблон прост. Используйте substr вместо:

$date = '20100930'; 
$year = substr($date,0,4); 
$month = substr($date,4,2); 
$day = substr($date,6,2); 
+0

Спасибо! Это работало очень хорошо и было просто для кого-то вроде меня понять! – imbadatjquery

+0

Это не отвечает на вопрос и не проверяет, дата состоит из числовых символов. – j4k3

0

Вам нужно поместить некоторые скобки вокруг шаблонов, которые вы хотели бы показать в $matches. Также я не думаю, что вы хотите удвоить \\ между вашим \d, потому что это позволит избежать второго \ и оставить вас в соответствии с буквами 'd'.

7

Хотя regex на самом деле не является хорошим решением для разбора даты в формате YYYYMMDD, давайте пройдем через , почему ваш шаблон не работает.

Ваш шаблон \d{4}\\d{2}\\d{2}\ говорит: «Матч 4 цифры (\d{4}), а затем с помощью обратной косой черты (\\), а затем букву д дважды (d{2}), а затем другой обратной косой черты (\\), а затем, наконец, еще два d's (d{2}). "

Как вы уже успели выяснить, вам не нужны двойные косые черты!

\d{4}\d{2}\d{2} 

Содержит 4 цифры, а затем 2 цифры, а затем еще 2 цифры.

Кроме того, вы не указали capturing groups, поэтому ваши подшаблоны никогда не будут заполнены. То, что вы, вероятно, имел в виду:

(\d{4})(\d{2})(\d{2}) 

Увидеть это в действии на http://www.ideone.com/iAy7K. Обратите внимание, что в вашем случае действительно нет никаких причин указывать флаг PREG_OFFSET_CAPTURE (который возвращает позицию каждого совпадения) или 0 для смещения.

3

Забудьте preg_match, использование StrToTime():

echo date('Y/m/d', strtotime($_POST['tor_from'])); 
+0

+1 strtotime регулярно поражает меня тем, что он примет. Однако это решение менее полезно, если вы хотите, чтобы детали были отдельно ... – lonesomeday

+0

Просто назначьте вывод strtotime переменной, затем вы можете использовать дату ('Y', $ date), чтобы получить год, дату ('m', $ date), чтобы получить месяц, и т. Д. –

+0

это очень много обработки чтобы разбить строку на три части ... –

3

Это лучше, как это, используя preg_match и индексированные имена.

$res = preg_match("/(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})/", $date, $matches); 

И Матчи будут выглядеть :,

array('year' => 2010, 'month' => 12, 'day' => 07); 

Приветствия.

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