Я знаю, что на этот вопрос ответили, но я думаю также о предоставлении regex
решения для этого:
Чтобы извлечь 1-ю группу , вы можете использовать приведенное ниже регулярное выражение:
preg_match('/.-.(\d+).-/', $str, $numExtracted);
if (!empty($numExtracted)) {
echo $numExtracted[1].PHP_EOL;
}
Чтобы извлечь ваш Год :
preg_match('/(\w\w\w).(\d\d).(\d\d\d\d)/', $str, $year, PREG_OFFSET_CAPTURE);
$year = $year[3][0];
echo $year.PHP_EOL;
Это работало на всех следующих испытаниях:
Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) oi oi - 1546546 - Last Updated: Nov 23 2015 02:24 PM
Online -sdtgstg346fg - (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM
Вы можете проверить рабочий код здесь
В соответствии с вашим комментарием вы можете расширить свое регулярное выражение для рассмотрения таких случаев:
.-.(\d+)?[\,\#\!\?\$\£\;\:]*(\d+)?.-
Это будет соответствовать всем вышеперечисленным плюс этим случаям:
Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 1123#!,123 - Last Updated: Nov 23 2015 02:24 PM
Но я думаю, что нужно подумать, хотите ли вы сохранить полученную информацию или просто считаете ее испорченной.
Вы можете даже ввести циклы для анализа каждого сценария, но если я ожидаю число, и вдруг regex
, который вызывает совпадение, относится к чему-то вроде 1A2B3C4G5D8D2F
, я откажусь от него, когда он далекоиз того, что я изначально ожидал.Но все зависит от того, где вы получаете свою информацию, насколько вероятно ее изменение и т. Д .: :)
Тем не менее, я думаю, regex
сделает вас счастливее и предоставит гораздо больше возможностей
PS: Для введенных особых случаев, поскольку число прерывается специальными символами (или даже словами, если вы их учитываете), теперь оно интерпретирует и 2 числа.