Non-надежный, быстрый и грязный - и неправильно - решение:
$ php -a
Interactive shell
php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
[0] => Array
(
[0] => 2300
[1] => 45
)
)
Update Per Aleks G предложение, выложив подводные камни к этому решению:
Первая проблема : это не соответствует чистым числам при строгом начале или конце строки. Чтобы сделать это, выполните Aleks G шаблон, который ставит якорные символы в захвате суб-моделей:
preg_match_all('/(^|\W)\d+(\W|$)/', '2300 df A6 242 sfd 45', $matches);
Вы можете сделать шаблон без захвата ('/(?:^|\W)\d+(?:\W|$)/'
), чтобы сигнализировать свое намерение, что круглые скобки для группировки, а не для захват - но это чисто необязательно, поскольку значения, которые вы все еще хотите, остаются в $matches[0]
.
Вторая проблема: \ b и \ W не совсем то же самое. \ b является «границей слов», а \ W «не является символом слова». Сравните результат Aleks G и мой ответ, и вы увидите, что \ b возвращает чистые числа, а \ W возвращает окружающее пространство.
Обновление За комментарий Zzolt Szilagy, \ d соответствует цифрам в текущем наборе символов, поэтому для языков с более цифровыми символами (например, китайский) вы не получите ожидаемых от 0 до 9. Для этого используйте класс символов [0-9].
Кстати, вы можете заменить \ d на [0-9]. \ d также находит китайские, тайские и японские цифры (всего более 1000 символов), и они могут обходить проверки безопасности и удалять базу данных при работе с дефоктически закодированными данными. –
@ZsoltSzilagy Хорошая точка. Обновление ответа ... –