Kom ihåg mig?
Home Menu

Menu


php: splitta sträng mellan alfa och numeriskt

Ämnesverktyg Visningsalternativ
Oläst 2013-01-14, 11:45 #1
aikon aikon är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 277
aikon aikon är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 277
Standard 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å.
aikon är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-14, 12:43 #2
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
Citat:
Ursprungligen postat av aikon Visa inlägg
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.
coredev är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-14, 13:49 #3
SweLogan SweLogan är inte uppkopplad
Medlem
 
Reg.datum: Sep 2007
Inlägg: 148
SweLogan SweLogan är inte uppkopplad
Medlem
 
Reg.datum: Sep 2007
Inlägg: 148
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
SweLogan är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-14, 13:52 #4
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Enklast är att använda preg_split:

Kod:
$stringarray = preg_split('/([0-9]+)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-15, 08:51 #5
aikon aikon är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 277
aikon aikon är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 277
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);
aikon är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-15, 09:33 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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();

?>

Senast redigerad av Conny Westh den 2013-01-15 klockan 09:42
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-15, 10:30 #7
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av aikon Visa inlägg
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.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


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

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