0

I have a need to extract a sub-string from a longer string. I know how I would approach it using PHP posstr(); and strpos();, but the data is very large and I suspect that it would be more efficient if I could extract the part string using regex.

For example, if I have a number, (say a latitude) that has the format

"3203.79453"

where the the two characters before and "all" the characters after the decimal point represent decimal seconds, then to obtain the decimal latitude I need to compute the following:

32 + (03.79453)/60 = 32.06324217

So in essence I need a regex method of extracting the sub-string "03.79453".

So two questions how do I achieve it using regex and is it faster than using the method of using strpos() and posstr().

Thanks

2 Answers 2

2

It's easy to achieve with both options:

substr($line, strpos($line, '.') - 2);

or:

preg_match("/(\d{2}\..*)/", $line, $matches);

As for performance, I guess you would need to benchmark it. I've done a quick test to compare the performance of each example by running one million reps of each of those lines:

  • preg_match: average around 1.6 seconds for 1,000,000 matches
  • substr: average around 0.85 seconds for 1,000,000 matches

In this case it seems clear that using substr is the winner in terms of performance.

Sign up to request clarification or add additional context in comments.

1 Comment

Perfect. Thanks very much Robbie.
1

You could use preg_replace() like so:

    <?php

        $geoCoordinate  = "3203.79453";
        $degrees        = preg_replace("#(\d{2}\.\d*?$)#", "",          $geoCoordinate);
        $seconds        = preg_replace("#(\d*?)(\d{2}\.\d*?)#", "$2",   $geoCoordinate);
        $degAndSecs     = round($degrees + ($seconds/60), 8);

        var_dump($degAndSecs);  //<== PRODUCES::: float 32.06324217

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.