Autor | Zpráva | ||
---|---|---|---|
apollon Profil |
#1 · Zasláno: 26. 3. 2008, 14:24:02
Ahoj, potřeboval bych pomoci s roztrháním řetězce na pole řetězců jako např.
$pizza = "díl1 díl2 díl3 díl4 díl5 díl6"; $dily = explode(" ", $pizza ); echo $dily[0]; // díl1 Vůbec netuším jak zadat více separátorů pro: $retezec="o.palladio c.384/2.5 L /"6003-55""; a aby výstup byl "o,palladio,c,384,2.5,L,6003,55". U 2.5 je problém, aby výstup nebyl 2 a 5, ale 2.5. Napadlo mě zaměnit / a " mezerou, pak provést explode se separátorem „mezera“ a pak odstranit tečku, kde je před písmeno tj. u „o.palladio“ a u mezi dvěma čísly tečku nechat „2.5“ |
||
nightfish Profil |
#2 · Zasláno: 26. 3. 2008, 14:34:22
chceš roztrhat řetězec v místech, kde je tečka, ale jen někdy
takže si musíš stanovit podmínky kdy trhat a kdy ne a pak nám je tu prezentovat na jejich základě můžeme sestavit regulární výraz nebo doporučit jinou strategii |
||
apollon Profil |
#3 · Zasláno: 26. 3. 2008, 14:55:50
$pizza = 'díl1/díl2 díl3"díl4 díl5-díl6 díl7.díl8 díl9.1 díl10';
$pizza = str_replace('/', ' ', $pizza); $pizza = str_replace('"', ' ', $pizza); $pizza = str_replace('-', ' ', $pizza); $pizza = str_replace('.', ' ', $pizza); $dily = explode(" ", $pizza ); Takže takhle bych vyhodil / " - . ale narazil jsem u díl9.1, roztrhne se na díl9 a 1. Jak se dá v díl9 zjistit číslo a pak ho porovnat s okolními prvky pole? |
||
Adam Zábranský Profil |
#4 · Zasláno: 26. 3. 2008, 16:12:23
Asi trochu neelegantní, ale funguje (alespoň u mě). Jestli chceš vysvětlím
$pizza = 'díl1/díl2 díl3"díl4 díl5-díl6 díl7.díl8 díl9.1 díl10'; $pizza = str_replace('/', ' ', $pizza); $pizza = str_replace('"', ' ', $pizza); $pizza = str_replace('-', ' ', $pizza); $pizza = preg_replace("/(\d)\.(\D)/","$1 $2", $pizza); $pizza = preg_replace("/(\D)\.(\d)/","$1 $2",$pizza); $dily = explode(" ", $pizza ); |
||
BetaCam Profil |
#5 · Zasláno: 26. 3. 2008, 16:42:14
apollon
Zadej přesnej vstup a pžesnej výstup co chceš. Pak se ti dá nejak poradit. Protože například tohle : $retezec="o.palladio c.384/2.5 L /"6003-55""; už je samo o sobě nesmysl. |
||
apollon Profil |
#6 · Zasláno: 26. 3. 2008, 16:44:36 · Upravil/a: apollon
koukám na to s otevřenou pusou, zajimavý. Vymyslel jsem něco s foreachem, ale nevychytá to všechno.
Jestli by si mi to mohl vysvětlit, byl bych rád :-) Jak by to vypadalo, kdybych chtěl odstranit "x" mezi dvěmi čísly? 100x100 -> 100 a 100 ale v textu by se nic nedělo. |
||
apollon Profil |
#7 · Zasláno: 26. 3. 2008, 16:54:08 · Upravil/a: apollon
$retezec="o.palladio c.384/2.5 L /"6003-55"";
už je samo o sobě nesmysl. by ses divil. Potřebuju to pro tátu do práce. Mají tam takto uložené výrobky v databázi, žádné parametry, ale takováto prasárna a je tam dokonce několik stejných názvů s různými id! Pro příklad "O.Palladio č.384/2.5 L" "Deska polycolor /"6003"" atd. Protože ta databáze je docela rozsáhlá a já jí chci porovnávat s jinou, kde jsou parametry tak potřebuji rozsekat na "parametry" |
||
BetaCam Profil |
#8 · Zasláno: 26. 3. 2008, 17:01:42 · Upravil/a: BetaCam
apollon
by ses divil. Potřebuju to pro tátu do práce. Mají tam takto uložené výrobky v databázi, žádné parametry, ale takováto prasárna a je tam dokonce několik stejných názvů s různými id! Proto se ptám co přesně potřebuješ protože ten tvůj příklad : $pizza = 'díl1/díl2 díl3"díl4 díl5-díl6 díl7.díl8 díl9.1 díl10'; By sel zapsat klidně i takhle: $pizza = 'dil1/dil2 dil3"dil4 dil5-dil6 dil7.dil8 dil9.1 dil10'; $pizza = preg_replace('/-|\"|\/|\.(?![0-9])/', ' ', $pizza); $dily = explode(" ", $pizza); echo '<pre>'.var_dump($dily).'</pre>'; proste by to chtělo aspon třeba 5-10 příkladů co máš v BD aby se z toho dal udělat pořádnej regulární výraz. Edit : nebo možná ještě lépe takhle : $pizza = 'dil1/dil2 dil3"dil4 dil5-dil6 dil7.dil8 dil9.1 dil10'; $pizza = preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); $dily = explode(" ", $pizza ); echo '<pre>'.var_dump($dily).'</pre>'; |
||
Adam Zábranský Profil |
#9 · Zasláno: 26. 3. 2008, 17:15:46 · Upravil/a: Adam Zábranský
$pizza = preg_replace("/(\d)\.(\D)/","$1 $2", $pizza);
$pizza = preg_replace("/(\D)\.(\d)/","$1 $2",$pizza); no hele tak tyto 2 řádky dělají toto (je to preg_replace takže tam pracuju s regulárnímy výrazy): d = čísla 0-9 a D = všechno kromě čísel takže když bude číslo.znak nebo znak.číslo tak to platí když se to dá do závorky tak se z toho udělá to $1 a $2 takže třeba a.9 se přemění na a 9, 8.b -> 8 b atd. ale když jsou 2 čísla tak to nic neudělá. |
||
apollon Profil |
#10 · Zasláno: 26. 3. 2008, 17:22:30
proste by to chtělo aspon třeba 5-10 příkladů co máš v BD aby se z toho dal udělat pořádnej regulární výraz.
Tak já ti děkuji, myslel jsem, že dostanu nějaký návod jak na to. $pizza = preg_replace('/-|\"|\/|\.(?![0-9])/', ' ', $pizza); tohle mi moc neříká. Jestli jsem malinko pochopil tak '/-|\' nahradí - za 'mezeru' atd., ale co .(?![0-9]) ? O.REGALE ORNAMEN.SING.BEIGE 25*30 CM HMOZDINKA TALIROVA 155 MM-8/60-PLAS.TRN3 THERMOLAN TP 116 tl.80 mm /0.625 x 1.35m/8,44 m2 THERMOLAN CLASSIC 040/ 80 mm /1200x12500 mm /role 15m2 STETEC PL.LAZUROVACI "3 /MODRA PLASTOVA RUCKA DVIRKA VANOVA /300x300MM NEREZ MOLITAN NAHRADNI POVRCH MODRY /30x16 CM |
||
BetaCam Profil |
#11 · Zasláno: 26. 3. 2008, 17:38:37
apollon
Takže já ti ro rozepíšu. preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); to co bude tučné tak o tom píšu preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); to sou delimitery v podstatě tě nemusí zajímat preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); toto je v podstatě OR (NEBO) preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); pokud si to spojíš stím že už víš co je | tak tato část říká pokud najdeš znak - nebo " nebo / nahrad ho za mezeru preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); říká pokud předcházející není číslice preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); říká pokud následující není číslice preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); říká pokud najdeš tečku která před sebou nemá číslici a zároven nemá číslici zasebou nahrad ji za mezeru preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)/', ' ', $pizza); v celku to říká narad znaky - " / a tečku která nemá z obou stran číslice za mezeru V případě nepochopení určitých částí se klidne zeptej. |
||
BetaCam Profil |
#12 · Zasláno: 26. 3. 2008, 17:56:16
apollon
100x100 -> 100 a 100 ale v textu by se nic nedělo. Je to v podstatě to samé jako u té tečky : preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)|(?<=\d)x(?=\d)/', ' ', $pizza); Jinak timhle si můžeš zkusit co to dává za výstupy : $pizz = array( 'O.REGALE ORNAMEN.SING.BEIGE 25*30 CM', 'HMOZDINKA TALIROVA 155 MM-8/60-PLAS.TRN3', 'THERMOLAN TP 116 tl.80 mm /0.625 x 1.35m/8,44 m2', 'THERMOLAN CLASSIC 040/ 80 mm /1200x12500 mm /role 15m2', 'STETEC PL.LAZUROVACI "3 /MODRA PLASTOVA RUCKA', 'DVIRKA VANOVA /300x300MM NEREZ', 'MOLITAN NAHRADNI POVRCH MODRY /30x16 CM', ); foreach($pizz as $pizza){ $pizza = preg_replace('/-|\"|\/|(?<!\d)\.(?!\d)|(?<=\d)x(?=\d)/', ' ', $pizza); $dily = explode(" ", $pizza ); echo '<pre>'.var_dump($dily).'</pre>'; } |
||
apollon Profil |
#13 · Zasláno: 26. 3. 2008, 18:03:18
BetaCam supr. :-) moc ti děkuji, za vysvětlení i řešení.
Děkuji i ostatním |
||
apollon Profil |
#14 · Zasláno: 26. 3. 2008, 18:17:07
$pizza = preg_replace('/-|\"|\/|(?<!\d)... musí se odstranit <
|
||
BetaCam Profil |
#15 · Zasláno: 26. 3. 2008, 18:19:51
apollon
Důvod??? pak už to má uplně jinej význam než si chtel. |
||
apollon Profil |
#16 · Zasláno: 26. 3. 2008, 18:23:43
no já to taky moc nechápu, protože jak si to napsal s > tak mi to přijde logický, ale nerozdělí to 'díl7.díl8' tedy alespoň u mě...
|
||
BetaCam Profil |
#17 · Zasláno: 26. 3. 2008, 18:33:12 · Upravil/a: BetaCam
apollon
Tak sem smazal opravu protože proste podle mě tak jak sem to napsal je to správně. Pokud tam u,ažes to < tak to mužeš tu tvrzení rovnou smazat protože nemá vůbec žádnou hodnotu. |
||
apollon Profil |
#18 · Zasláno: 26. 3. 2008, 19:00:41 · Upravil/a: apollon
BetaCam
tak já jsem si tam doplnil toto. Jenom ještě musim předělat vstup na malá písmena, aby nemusely bát v poli $jedn i varianty jako cM, MM atd. Ve vstupních datech je 300MM, 15m2 atd. Jinak jak píšeš s tím < tak mi to nejde :-( $jedn=array('mm','cm','dm','m','mm2','cm2','dm2','m2','mm3','cm3','dm3 ','m3'); foreach($pizz as $pizza){ //$pizza = preg_replace('/-|\"|\/|\.(?<!\d)(?!\d)|x(?<=\d)(?=\d)/', ' ', $pizza); $pizza = preg_replace('/-|\"|\/|(?!\d)\.(?!\d)|(?<=\d)x(?=\d)|(?<=\d)\*(?=\d)/' , ' ', $pizza); $pizza = preg_replace('/(?<=\d),(?=\d)/', '.', $pizza); foreach($jedn as $jednotky){ $pizza = preg_replace('/'.$jednotky.'/', ' '.$jednotky.'', $pizza); } $dily = explode(" ", $pizza ); print_r($dily); //echo '<pre>'.var_dump($dily).'</pre>'; } |
||
BetaCam Profil |
#19 · Zasláno: 26. 3. 2008, 19:24:53
apollon
Jinak jak píšeš s tím < tak mi to nejde :-( Určitě sem blbej a na něco sem tam zapoměl, ale prostě když na to tak koukam tak tam nic nevidim. :) |
||
Adam Zábranský Profil |
#20 · Zasláno: 26. 3. 2008, 19:40:56
Jenom ještě musim předělat vstup na malá písmena
tak tam můžeš dát i někam, což znamená že nezáleží na malých a velkých písmenech, nevím kam se to přesně dává ale typnu $pizza = preg_replace('/'.$jednotky.'/i', ' '.$jednotky.'', $pizza); ať mě kdyžtak zkušenější opraví |
||
apollon Profil |
#21 · Zasláno: 27. 3. 2008, 08:53:18 · Upravil/a: apollon
Teď to vypadá jako finální verze. "Všechny" záludnosti se vyřešily.
Děkuji BetaCam, Adam Zábranský $jedn=array('mm','cm','dm','mm2','cm2','dm2','m2','mm3','cm3','dm3','m 3'); foreach($pizz as $pizza){ $pizza = preg_replace('/-|\"|\/|(?!\d)\.(?!\d)|(?<=\d)x(?=\d)|(?<=\d)\*(?=\d)/' , ' ', $pizza); $pizza = preg_replace('/(?<=\d),(?=\d)/', '.', $pizza); foreach($jedn as $jednotky){ $pizza = preg_replace('/'.$jednotky.'/i', ' '.$jednotky.'', $pizza); $pizza = preg_replace('/(?<=\d)m/i', ' m', $pizza); } $dily = explode(" ", $pizza ); print_r($dily); //echo '<pre>'.var_dump($dily).'</pre>'; } |
||
Časová prodleva: 16 let
|
0