Извлечение шаблона с помощью preg_match

#php #preg-match

#php #preg-match

Вопрос:

У меня есть строковая переменная, и я хочу извлечь только год и число.

 $val = '2015(15)';
preg_match ('/(.*?)((.*?))/',$val,$match);
print_r($match);
  

Вывод: Array ( [0] => 2015(15) [1] => 2015 [2] => 15 )

Ожидается: все в порядке. или Array ( [0] => 2015 [1] => 15 )

 $val = '2015';
preg_match ('/(.*?)((.*?))/',$val,$match);
print_r($match);
  

Вывод: Array ( )

Ожидаемый: Array ( [0] => 2015 [1] => )

 $val = '(15)';
preg_match ('/(.*?)((.*?))/',$val,$match);
print_r($match);
  

Вывод: Array ( [0] => (15) [1] => [2] => 15 )

Ожидаемый: Array ( [0] => [1] => 15 )

Комментарии:

1. Разве вы не можете просто взорвать ) и удалить final ) из второго элемента? Существуют и другие способы, отличные от регулярных выражений.

2. ДА. Я могу использовать split или explode и обрезать последний индекс результирующего массива с помощью ‘)’. Спасибо за решение.

Ответ №1:

Решение

Возможно, вы можете попробовать что-то вроде,

 /([0-9]{4})?(?:(([0-9]*)))?/
  

Комментарии:

1. если говорить о номере года, то ([12][0-9]{3}) это немного более реалистично, даже рассмотрите аббревиатуру two number form как преобразовать обратно в 4, если только годы после 2000 считаются тогда (2[0-9]{3})

2. Спасибо. Таким образом, я могу достичь ожидаемого результата.

3. @cske Это вполне приемлемо, но также делает код устаревшим после 2999. На самом деле, нет причин не принимать годы от 0000 до 9999, и причина, по которой я жестко ограничиваю годы 4 числами, заключается в том, что предоставил OP.

4. я имею в виду реальную жизнь, а не какую-то академическую прописку, я не думаю, что это счастливый путь для OP, чтобы соответствовать эквалайзеру. 0001

5. @cske Это прискорбно.