Kom ihåg mig?

php: splitta sträng mellan alfa och numeriskt

 
Ämnesverktyg Visningsalternativ
Gammal 2013-01-14, 12: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
Gammal 2013-01-14, 13:43 #2
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
Skicka ett meddelande via MSN till coredev
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
Skicka ett meddelande via MSN till coredev
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.
__________________
/Robert @ Code Addiction
In omnibus requiem quaesivi, et nusquam inveni nisi in angulo cum libro
coredev är inte uppkopplad   Svara med citatSvara med citat
Gammal 2013-01-14, 14: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
__________________
Tele: +46 (0)70 456 27 45
SweLogan är inte uppkopplad   Svara med citatSvara med citat
Gammal 2013-01-14, 14:52 #4
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 588
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 588
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
Gammal 2013-01-15, 09: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
Gammal 2013-01-15, 10:33 #6
Conny Wesths avatar
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 197
Skicka ett meddelande via MSN till Conny Westh
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
Conny Wesths avatar
 
Reg.datum: Aug 2005
Inlägg: 5 197
Skicka ett meddelande via MSN till Conny Westh
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();

?>
__________________
Företagsrådgivning, Teknisk Projektledning, Senior Backend Systemutvecklare med inriktning mot Visual Studio, Microsoft .NET (C#, VB.NET) , databasmodellering i SQL-server.
Fakturerar numera genom CoolCompany (Fakturera utan eget företag) https://short.coolcompany.com/ph7cu

Senast redigerad av Conny Westh den 2013-01-15 klockan 10:42
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Gammal 2013-01-15, 11:30 #7
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 588
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 588
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)
 
Ämnesverktyg
Visningsalternativ

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 04:45.

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