Preg_match для свидания - PullRequest
       6

Preg_match для свидания

4 голосов
/ 01 октября 2010

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

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

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

Ответы [ 5 ]

7 голосов
/ 01 октября 2010

Хотя регулярное выражение не очень хорошее решение для анализа даты в формате ГГГГММДД, давайте рассмотрим , почему ваш шаблон не работает.

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

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

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

Будет соответствовать 4 цифры, а затемна 2 цифры, а затем еще на 2 цифры.

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

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

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

3 голосов
/ 01 октября 2010

Это лучше, используя 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);

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

3 голосов
/ 01 октября 2010

Забудьте preg_match, используйте strtotime ():

echo date('Y/m/d', strtotime($_POST['tor_from']));
1 голос
/ 01 октября 2010

Регулярное выражение - не лучший способ, если шаблон такой простой. Используйте substr вместо:

$date = '20100930';
$year = substr($date,0,4);
$month = substr($date,4,2);
$day = substr($date,6,2);
0 голосов
/ 01 октября 2010

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

...