Autor Zpráva
apollon
Profil
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
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
$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
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
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
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
$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
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
$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
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
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
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
BetaCam supr. :-) moc ti děkuji, za vysvětlení i řešení.

Děkuji i ostatním
apollon
Profil
$pizza = preg_replace('/-|\"|\/|(?<!\d)... musí se odstranit <
BetaCam
Profil
apollon

Důvod??? pak už to má uplně jinej význam než si chtel.
apollon
Profil
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
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
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
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
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
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>';
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: