PHP, как избежать смешанных цифр и букв при извлечении фрагментов чисел из строкиPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP, как избежать смешанных цифр и букв при извлечении фрагментов чисел из строки

Сообщение Anonymous »

Я пишу функцию PHP для извлечения числовых идентификаторов из строки, например:

Код: Выделить всё

$test = '123_123_Foo'
Сначала я использовал два разных подхода, один с preg_match_all():

Код: Выделить всё

$test2 = '123_1256_Foo';
preg_match_all('/[0-9]{1,}/', $test2, $matches);
print_r($matches[0]); // Result: 'Array ( [0] => 123 [1] => 1256 )'
и другие с помощью preg_replace() и взрыв():

Код: Выделить всё

$test = preg_replace('/[^0-9_]/', '', $test);
$output = array_filter(explode('_', $test));
print_r($output); // Results: 'Array ( [0] => 123 [1] => 1256 )'
Любой из них работает хорошо, если строка не содержит смешанных букв и цифр, например:

Код: Выделить всё

$test2 = '123_123_234_Foo2'
Очевидный результат: Array ( [0] => 123 [1] => 1256 [2] => 2 )

Поэтому я написал еще одно регулярное выражение, чтобы избавиться от смешанных строк:

Код: Выделить всё

$test2 = preg_replace('/([a-zA-Z]{1,}[0-9]{1,}[a-zA-Z]{1,})|([0-9]{1,}[a-zA-Z]{1,}[0-9]{1,})|([a-zA-Z]{1,}[0-9]{1,})|([0-9]{1,}[a-zA-Z]{1,})|[^0-9_]/', '', $test2);
$output = array_filter(explode('_', $test2));
print_r($output); // Results: 'Array ( [0] => 123 [1] => 1256 )'
Проблема также очевидна: более сложные шаблоны, такие как Foo2foo12foo1, пройдут фильтр. И здесь я немного застрял.

Резюме:


[*]Извлеките переменная количество фрагментов чисел из строки.
[*]Строка содержит как минимум 1 число и может содержать другие цифры
и буквы, разделенные подчеркиванием.
[*]Должны быть извлечены только числа, которым не предшествуют и не следуют буквы.
[*]Имеют значение только числа в первой половине строки.


Поскольку нужна только первая половина, я решил разделить первое вхождение буквы или смешанное число-букву с помощью preg_split():

Код: Выделить всё

$test2 = '123_123_234_1Foo2'
$output = preg_split('/([0-9]{1,}[a-zA-Z]{1,})|[^0-9_]/', $test, 2);
preg_match_all('/[0-9]{1,}/', $output[0], $matches);
print_r($matches[0]); // Results: 'Array ( [0] => 123 [1] => 123 [2] => 234 )'
Суть моего вопроса в том, существует ли более простой, безопасный или более эффективный способ достижения этого результата.

Подробнее здесь: https://stackoverflow.com/questions/469 ... -from-stri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»