Вот способ сделать это в bash, если у вашего вида нет сортировки версий:
cat <your_former_ls_output_file> | awk ' BEGIN { FS="_" } { printf( "%03d\n",$2) }' | sort | awk ' { printf( "data_%d_box\n", $1) }'
Все в одной строке. Имейте в виду, я не проверял это на ваших конкретных данных, поэтому может потребоваться небольшая настройка для правильной работы для вас. Это обрисовывает в общих чертах хорошее, надежное и относительно простое решение, все же. Конечно, вы всегда можете поменять имя файла cat + в начале на фактическое значение ls, чтобы создать данные файла на лету. Для захвата фактического столбца имени файла вы можете выбрать между правильными параметрами ls или передачей через cut или awk.
$str = '152.15 x 12.34 x 11mm';
preg_match_all('!\d+(?:\.\d+)?!', $str, $matches);
$floats = array_map('floatval', $matches[0]);
print_r($floats);
Конструкция регулярного выражения (?: ...)
- это так называемая не захватывающая группа . Это означает, что фрагмент не возвращается отдельно в части массива $ mathces
. Это не является строго необходимым в данном случае , но это полезная конструкция, которую следует знать.
Примечание: вызов floatval ()
для элементов также не является строго необходимым. поскольку PHP обычно правильно манипулирует типами, если вы попытаетесь использовать их в арифметических операциях или аналогичных. Хотя это не больно, особенно из-за того, что он всего лишь один лайнер.
$string = '152.15 x 12.34 x 11mm';
preg_match_all('/(\d+(\.\d+)?)/', $string, $matches);
print_r($matches[0]); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 )
<?php
$s = "152.15 x 12.34 x 11mm";
if (preg_match_all('/\d+(\.\d+)?/', $s, $matches)) {
$dim = $matches[0];
}
print_r($dim);
?>
дает
Array
(
[0] => 152.15
[1] => 12.34
[2] => 11
)
$str = "152.15 x 12.34 x 11mm";
$str = str_replace("mm", "", $str);
$str = explode("x", $str);
print_r($str); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 )
Протестировано, работает со всеми приведенными выше строками.
preg_match_all("/\d*\.?\d+|\d+/", "152.15mmx12.34mm x .11mm", $matches);
В этом примере также поддерживаются такие числа, как .11 , поскольку они являются действительными числами. $ match [0]
будет содержать 152,15 , 12,34 и 0,11 , если вы введете приведение результата к float. Если вы этого не сделаете, 0.11 будет отображаться как .11 . Я бы набрал приведение, используя array_map
.
$values = array_map("floatval", $matches[0]);
Однако вы можете использовать значения для любых математических операций без преобразования типов. литье просто необходимо при прямой печати.