регулярка

12
P
На сайте с 14.05.2012
Offline
35
532


[64] => 10,5C

[65] => 26,0C

[66] => 26,0C

[67] => 26,0C

[68] => 26,0C

[69] => 26,0C

[70] => 26,0C

[71] => 26,0C

[72] => 14,5C

[73] => 14,5C032

[74] => 30,5C

[75] => 30,5C

[76] => 30,5C

[77] => 30,5C

вот есть такой массив, нужня регулярка что бы оставалось только "14,5" от "14,5C"

но бывают что попадаются вот такие вот значения "14,5C032"


$line[1] = preg_replace("????????????", "", $data[1]);

помогите составить регулярку

R
На сайте с 18.12.2009
Offline
92
#1

Да можно и без регулярки. Вопрос - всегда будет 4 символа?

Или возможны варианты, типа 8,6, где 3 символа? Или даже так - 8, когда 8,0.

P
На сайте с 14.05.2012
Offline
35
#2

0,0C
26,0C
28,5C
126,0C
543,0C
1026,0C
4125,0C
-16375,0C

Вот такие. И встречаются вот такие "не правильные"


30,0C18428
2,0C064

и т.п.

FollowLocation
На сайте с 19.07.2013
Offline
12
#3
30,0C18428

Если из этого нужно оставить только

30,0
, то
list ($arr[$i]) = explode ('C', $arr[$i]);

Если только убрать 'C', то

$arr[$i] = str_replace ('C', '', $arr[$i]);
R
На сайте с 18.12.2009
Offline
92
#4


$arr = explode('C', $data[1])
$line[1] = $arr[0];

UPD. Выше уже ответили.

O
На сайте с 29.05.2008
Offline
195
#5

substr($string, 0, ($position = stripos($string, 'C') === false) ? strlen($string) : $position)

Это решение работает быстрее всех и не создает объектов в ОЗУ.

A
На сайте с 19.07.2010
Offline
130
#6


if( preg_match('/^(\-?\d+,\d)/', $data[1], $mm) ){
echo "t = {$mm[1]}\n";
}else{
echo "not correct string\n";
}

.............
FollowLocation
На сайте с 19.07.2013
Offline
12
#7

ortegas, во времени выполнения Ваш скрипт значительно уступает обычному explode


$string = '14,5C032';

$start = microtime(true);

for ($i=0;$i<1000000;$i++) {
list ($tmp) = explode ('C', $string);
//$tmp = substr($string, 0, ((($position = stripos($string, 'C')) === FALSE) ? strlen($string) : $position));
}

printf('Время: %.4F сек.<br>', (microtime(true) - $start));
printf('Память: %.1F Кб<br>', memory_get_usage()/1024);
Время: 4.1046 сек.
Память: 318.9 Кб

$string = '14,5C032';


$start = microtime(true);

for ($i=0;$i<1000000;$i++) {
//list ($tmp) = explode ('C', $string);
$tmp = substr($string, 0, ((($position = stripos($string, 'C')) === FALSE) ? strlen($string) : $position));
}

printf('Время: %.4F сек.<br>', (microtime(true) - $start));
printf('Память: %.1F Кб<br>', memory_get_usage()/1024);
Время: 7.0646 сек.
Память: 320.4 Кб
O
На сайте с 29.05.2008
Offline
195
#8

FollowLocation, в моем методе есть валидация и не может быть аномалий. Explode предназначен для чего? Это равносильно следующему коду по производительности, функциональности, но использование памяти в explode будет больше:


substr($string, 0, strpos($string, 'C'))

Но я привел доскональный код, с предварительной проверкой. Сделайте предварительную проверку для explode и тогда смотрите на результат. И да, будет слишком глупо критиковать мой метод и использовать strpos для проверки, поэтому, проверять вам придется через регулярное выражение, а это уже в 100 раз медленнее моего метода.

Хотите производительный вариант? Подозреваю, этому конкурентов не будет.


(float)strtr($string, ',', '.');
FollowLocation
На сайте с 19.07.2013
Offline
12
#9

ortegas, но приведенный Вами код (в отличии от explode)

substr($string, 0, strpos($string, 'C'))
даст сбой, если не будет обнаружено "C".
(float)strtr($string, ',', '.');

по времени почти равны (но всё же Ваш вариант немного быстрее) с explode. Единственное - мне кажется, что я не правильно замеряю память. И буду благодарен, если Вы меня в этом исправите

O
На сайте с 29.05.2008
Offline
195
#10

FollowLocation, а float не даст, float быстрее, но... float также нелепо как и explode. Не предназначено оно для разбора строк. Можно найти еще быстрее решение. Но стабильность будет падать, а нелепость расти. Единственное правильное решение - substr.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий