WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   php: splitta sträng mellan alfa och numeriskt (https://www.wn.se/forum/showthread.php?t=1056394)

aikon 2013-01-14 11:45

php: splitta sträng mellan alfa och numeriskt
 
Hur gör jag bäst följande i php.

$string = "a1b12ccc3d44";

Jag vill splitta denna sträng mellan numeriska och ickenumeriska tecken, och få en array som ska se ut så här:

$stringarray[0] = "a"
$stringarray[1] = "1"
$stringarray[2] = "b"
$stringarray[3] = "12"
$stringarray[4] = "ccc"
$stringarray[5] = "3"
$stringarray[6] = "d"
$stringarray[7] = "44"

Är usel på regex men gissar att det är vägen att gå.

coredev 2013-01-14 12:43

Citat:

Ursprungligen postat av aikon (Inlägg 20459487)
Hur gör jag bäst följande i php.

$string = "a1b12ccc3d44";

Jag vill splitta denna sträng mellan numeriska och ickenumeriska tecken, och få en array som ska se ut så här:

$stringarray[0] = "a"
$stringarray[1] = "1"
$stringarray[2] = "b"
$stringarray[3] = "12"
$stringarray[4] = "ccc"
$stringarray[5] = "3"
$stringarray[6] = "d"
$stringarray[7] = "44"

Är usel på regex men gissar att det är vägen att gå.

Du kan säkert lösa det med regular expressions, men jag hade i detta fall löst det med en foreach-loop. Loopa igenom din sträng. Ha ett state som säger om nuvarande index är bokstäver eller nummer. Om nästa typ av tecken inte stämmer överens med det förra så inkrementerar du indexet och börjar appenda på nästa index istället.

SweLogan 2013-01-14 13:49

Vet inte hur man lägger ihop det till en reg exp. Men kan du köra den två ggr så kan du använda.
(\D*) för a-z
(\d*) för 0-9

tartareandesire 2013-01-14 13:52

Enklast är att använda preg_split:

Kod:

$stringarray = preg_split('/([0-9]+)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

aikon 2013-01-15 08:51

Tack!

Jag har även fått ett annat förslag privat, som också fixar problemet.

Kod:

preg_match_all("/([a-zA-Z]+|[0-9]+)/", $string, $stringarray);

Conny Westh 2013-01-15 09:33

Skillnaden är väl att preg_match_all() skapar skapar subarrayer medan preg_splkit() gör det i en nivå. Se exempelkoden nedan. Jag är ingen stjärna på PHP men det var kul att testa i alla fall.

Kod:

<?php
        class SplitStringNum
        {
                public function SplitStringNum1($string)
                {
                        $stringarray = preg_split('/([0-9]+)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);;
                        return $stringarray;
                }
               
                public function SplitStringNum2($string)
                {
                        preg_match_all("/([a-zA-Z]+|[0-9]+)/", $string, $stringarray);
                        return $stringarray;
                }
                public function PrintStringArray($stringarray)
                {
                        foreach ($stringarray as $string)
                        {
                                if (is_array($string))
                                {
                                        echo "-----------------------------------------\n" ;
                                        echo "------- This also has a sub array -------\n" ;
                                        echo "-----------------------------------------\n" ;
                                        $this->PrintStringArray($string);
                                }
                                else
                                {                                        echo $string . "\n";
                                }
                        }
                }
        }
       
        class SplitStringNumTest
        {
               
                public function Test()
                {
                        $string = "a1b12ccc3d44";
                       
                        echo "\n-----------------------------------------\n" ;
                        echo "First attempt to se content of parameters\n";
                        echo "-----------------------------------------\n" ;
                        $StringNum1 = new SplitStringNum();
                        $stringarray1 = $StringNum1->SplitStringNum1($string);
                        $StringNum1->PrintStringArray($stringarray1);
       
                        echo "\n-----------------------------------------\n";
                        echo "Second attempt to se content of parameters\n";
                        $StringNum2 = new SplitStringNum();
                        $stringarray2 = $StringNum2->SplitStringNum2($string);
                        $StringNum2->PrintStringArray($stringarray2);
                }
        }
       
        $test = new SplitStringNumTest();
        $test->Test();

?>


tartareandesire 2013-01-15 10:30

Citat:

Ursprungligen postat av aikon (Inlägg 20459569)
Tack!

Jag har även fått ett annat förslag privat, som också fixar problemet.

Kod:

preg_match_all("/([a-zA-Z]+|[0-9]+)/", $string, $stringarray);

Jo, det funkar också. Ska du bara splitta strängen så är dock preg_split bättre och det mer intuitiva valet. Den är 25-30% snabbare i det här fallet.


Alla tider är GMT +2. Klockan är nu 07:23.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson