Регулярка: удалить все, кроме цифр и минус, если есть

Статус
Закрыто для дальнейших ответов.

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
834
На входе строка любых знаков - на выходе число из имеющихся цифр в строке или ноль, если цифр нету. Если есть минус/минусы левее самой левой цифры, то на выходе отрицательное число:
'' или '0' или 'вап-ер.ю/' => 0
'123' или 'a1b2c3d' или 'a1b-2c3d-' => 123
'-123' или '---a1b2c3d' или 'a-1b-2c3d-' => -123
Дальше этого $digit = preg_replace('/D/', '', $string) у меня чёт не продвигается.
Помогите люди добрые!
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
Могу предложить вариант "с душком" (на случай если элегантный никто не предложит):
Код:
$strings = array(  '' => '0',  '0' => '0',  'вап-ер.ю/' => '0',  '123' => '123',  'a1b2c3d' => '123',  'a1b-2c3d-' => '123',  '-123' => '-123',  '---a1b2c3d' => '-123',  'a-1b-2c3d-' => '-123',);echo '<table border="1">';echo "<tr><th>input</th><th>output</th><th>is ok?</th></tr>";foreach($strings as $str=>$res) {    $s = convert($str);  echo "<tr><td>$str</td><td>$s</td><td>";  echo $s == $res ? 'OK' : 'ERROR';  echo '</td></tr>';}echo '</table>';/*--------------------------------------------------------*/function convert($str) {  $s = 0;  if ( preg_match('/d/', $str) ) {    $s = preg_replace('/[^d-]/', '', $str);    $minus = '';    if ( preg_match('/^-/', $s) ) $minus = '-';    $s = $minus.preg_replace('/-/', '', $s);  }    return $s;}
"Тесты" вроде бы проходит :):

regexp.png
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
Код:
preg_replace(array("#[^d-]+#","#(.)-#","#^$|^-$#"),array('','$1',0),$text);
 

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
834
Medwoodu и brevis, спасибки!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ