// If you just want to see the year difference then use this function.
// Using the logic I've created you may also create month and day difference
// which I did not provide here so you may have the efforts to use your brain.
// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);
function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year = 0;
while($date2 > $date1 = strtotime('+1 year', $date1)){
++$year;
}
return $year;
}
Вы можете использовать это регулярное выражение для соответствия строк, которые вы хотите,
(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+
Объяснение:
(?=\S*[a-z])
- Этот взгляд вперед гарантирует, что во входящем слове есть, по крайней мере, алфавитный символ (?=\S*\d)
- этот прогноз гарантирует, что во входящем слове есть хотя бы цифра [a-z\d]+(?:[.-][a-z\d]+)+
- эта часть захватывает слово содержит буквенно-цифровое слово, содержащее хотя бы один специальный символ .
или -
Вот PHP демонстрация кода, модифицирующая ваш код,
$input = '3370.01b, 6510.01.b, m-5510.30, and drm-2013-c-004914 hello, sk8, and mixed-up';
$output = preg_replace_callback('/(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;
Prints,
3370.01B, 6510.01.B, M-5510.30, and DRM-2013-C-004914 hello, sk8, and mixed-up
Регулярное выражение:
https://regex101.com/r/sdmlL8/1
(?=.*\d)(.*)([-.])(.*)
Код PHP:
[ 113] https://ideone.com/qEBZQc
$input = '3370.01b';
$output = preg_replace_callback('/(?=.*\d)(.*)([-.])(.*)/i', function($matches){return strtoupper($matches[0]);}, $input);
Я не думаю, что вы никогда не захватывали что-либо, чтобы положить в спички ...
$input = '3370.01b foo';
$output = preg_replace_callback('/(?=.*[0-9])(?=.*[a-z])(\w+(?:[-.]\w+)+)/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;
Выход
3370.01B foo