2012-06-04 2 views
1

PHP REGEX - моя слабость, но все же мне удается кое-что сделать с помощью онлайн-инструментов. Рассмотрим следующий пример:PHP regex sytax с preg_replace

Субъект строка, которая в целом соответствует схеме: 1551 UTC 04 июня 2012

Я хочу, чтобы извлечь «04» и присвоить его переменной $ день, используя ниже:

$day = preg_replace("/^([0-9]{4})\s([A-Z]{3})\s([0-9]{2})\s([A-Za-z]{3,})\s([0-9]{4})$/", "$3", $weather['date']); 

Это работает на следующем веб-сайте: http://sqa.fyicenter.com/Online_Test_Tools/Test_Regular_Expression_Search_Replace.php

, но я не могу заставить его работать в моем скрипте ... $ day будет равно всей теме.

+1

Вы пробовали '$ день = даты ('d', StrToTime ($ погоду [ 'дату'])) ; ' – sesser

+2

Я просто испытал это сам, он отлично работает; вы должны делать что-то еще неправильно (что происходит, когда вы var_dump() '$ weather ['data']'?) – Jeroen

+0

@randy Конечно, это специально возвращает 01 ... Я не думаю, что формат $ weather ['date'] подходит для работы strtotime(). Я действительно пытаюсь извлечь различные части $ weather ['date'], чтобы создать строку, которую может использовать strtotime(). – WhiskeyMike

ответ

2

Результат var_dump(): string(38) "1551 UTC 04 June 2012 ". Он имеет 38 символов, тогда как он должен быть только 21. Таким образом, похоже, что в строке есть несколько пробелов.

Попробуйте trim() вашей входную строку и заменить \s с \s+ для поддержки нескольких пробельных:

$day = preg_replace("/^([0-9]{4})\s+([A-Z]{3})\s+([0-9]{2})\s+([A-Za-z]{3,})\s+([0-9]{4})$/", "$3", trim($weather['date'])); 
+0

Я думаю, что вы на что-то. После использования выше, все еще не работает, но мне удалось получить его до 31 символа ... (с квантификатором «+», прикрепленным к пробелу »\ s» – WhiskeyMike

+0

Используя вашу логику, я смог заставить ее работать. Вместо символа пробела я заменил его мета-символом периода (.). Я счастлив, что это работает сейчас, но он оставляет другой вопрос, какие другие символы добавляются, что я не вижу? – WhiskeyMike

+0

Ну, это выглядит они не являются пробелами, но не напечатаны. Может быть, 'ESC',' DEL', 'NULL' или что-то еще. – flowfree

0

вы говорите preg_replace, но я думаю, вы хотите использовать preg_match(). Правильно ли, что вы не хотите заменить «04», но просто хотите вставить его в переменную $ day? Если это так, используйте preg_match(). В своем описании вы говорите, что хотите захватить только часть «04», но в вашем регулярном выражении много групп захвата (что-либо внутри «()» является группой захвата и будет возвращено в массиве, который вы передаете preg_match).

+0

http://www.php.net/manual/en/function.preg-match.php – solidau

+0

Вы абсолютно правы, но способ, которым он использует preg_replace() **, должен работать **; используя preg_match, не исправляет его проблему. – Jeroen

+0

Согласен, что он должен работать, но 'preg_match' немедленно вернет все соответствующие части. – Herbert