3

I have variables that always start with a number or numbers and need the script to determine where this number ends, now for an example the variable can be like the following:

1234-hello1.jpg

1 hello1.gif

1234hello1.gif

123456 hello1.gif

What I am trying to say is an explode function would not work, and my regex is very poor, I just need to be left with the first number and ignore any other number in the string. I just need to be left with the number(s) in bold.

Thanks in advance...

Peter Bennett
  • 184
  • 1
  • 2
  • 15

8 Answers8

3
$arr = str_split($str);
for($i = 0; $i < count($arr); ++$i){
   if(!is_numeric($arr[$i])){
       echo "Number ends at index: " . $i;
       break;
   }
}

You could also put the numbers into an array using $arr[$i] if you so wish. This is probably a lot more readable than using regex.

You could add logic to allow one decimal point but from the question it seems you only want integers.

http://sandbox.onlinephpfunctions.com/code/fd21437e8c1502b56572a624cf6e4683cf483a8d - Example of working code

Roy
  • 3,027
  • 4
  • 29
  • 43
  • Perfect, just needed to make a few minor alterations to put the whole number in a single variable. `$str = "1234-hello1.jpg"; $arr = str_split($str); for($i = 0; $i < count($arr); ++$i){ if(!is_numeric($arr[$i])){ //echo "Number ends at index: " . $i; break; } else { $num[] = $str[$i]; } } $fullNumber = join("", $num); echo $fullNumber;` – Peter Bennett Aug 08 '16 at 11:45
2

If you are sure that the number is an integer, at the beginning and always present, you can use sscanf:

echo sscanf($val, '%d')[0];
Casimir et Hippolyte
  • 88,009
  • 5
  • 94
  • 125
1

Peter Bennett, You can try like this. First, convert a string(1234-hello1.jpg) to an Array. then you can check whether given array element is Number or not.

$str = "1234-hello1.jpg";       //given string
$count = strlen($str);          //count length of string
$num = array();

for($i=0; $i < $count; $i++)
{
    if(is_numeric($str[$i]))     //to check element is Number or Not
    {
        $num[] = $str[$i];       //if it's number, than add it to another array
    }
    else break;                  //if array element is not a number. exit **For** loop
}

$number = $num;                //See o/p
$number = implode("", $number);   
echo $number;                    // Now $number is String.

Out Put

 $num = Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
);


$number = "1234";   //string

So finally you got your required string.

Smit Patadiya
  • 1,488
  • 1
  • 9
  • 6
  • You should change this to the accepted answer - this works great in every PHP programmers toolkit of favorite functions. – Michael Fever Oct 15 '16 at 04:50
0

A RegEx is indeed the way to go:

function getVal($var){
    $retVal = '';

    if(preg_match('#^(\d+)#', $var, $aCapture)){  //Look for the digits
        $retVal = $aCapture[1];    //Use the digits captured in the brackets from the RegEx match
    }
    return $retVal;
}

What this does is look for only digits at the start of the string, capture them in an array, and use the piece we want.

Ben Hillier
  • 2,126
  • 1
  • 10
  • 15
0

preg_match('/^[0-9]+/', $yourString, $match);

Now you can check $match for the integer.

Celoain
  • 135
  • 7
0

This is the RegEx what you need:

^.*\b([0-9]+)

I don't know which language you are writting, so just give you the RegEx. It's tested in Notepad++ with your Examples.

gyun
  • 1
  • What is your reason for using a wordboundary? You could have the same effect with a lazy quantifier. https://3v4l.org/nGJsp or by simply not bothering to match leading non-digitals at all. – mickmackusa Aug 07 '22 at 11:41
0

Here is the full working script, with thanks to @user1...

$str = "1234-hello1.jpg";
$arr = str_split($str);
for($i = 0; $i < count($arr); ++$i){
   if(!is_numeric($arr[$i])){
       //echo "Number ends at index: " . $i;       
       break;
  } else {
        $num[] = $str[$i];   
   }
}

$fullNumber = join("", $num);

echo $fullNumber;
Peter Bennett
  • 184
  • 1
  • 2
  • 15
-1

I think you can remove no from your sting with below code.

preg_replace('/[0-9]+/', '', $string);

here $string is variable you can change this name as per your variable name.

Denis Bhojvani
  • 817
  • 1
  • 9
  • 18
  • 1
    This does the opposite of what the OP wanted. He wants only the first digits. This returns everything apart from the first digits. – Ben Hillier Aug 08 '16 at 10:20