Regulárni výrazy rozbor řetězce preg match – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Regulárni výrazy rozbor řetězce preg match – PHP – Fórum – Programujte.comRegulárni výrazy rozbor řetězce preg match – PHP – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
lubík
~ Anonymní uživatel
16 příspěvků
9. 12. 2012   #1
-
0
-

Dobrý den potřeboval bych pomoct s rozboremdvou řádků který vytáhnu z DB,

řádek 1) B14956-H39406-W71-dmg80-13.3.12 (+podložka) 

řádek 2) 120366-4064-dmg35-16.3.12 [opak. W56-114660] (podložka)
předem nevím který z těchto dvou řádků vytáhnu z DB v případě že dostanu první řádek potřebuju ho rozebrat tak abych

si do proměnných uložil každou část oddělenou pomlčkou a pak už je jen správně poskládám a upravené pak vložím

zpět do DB

řádek1) $cislo_vykresu-$folge-$slozka-$stroj-$datum ($komentar)  <= tyto proměnné zastupují každou část řetězce

.pokud dostanu z DB druhý řádek potřebuji jen nahradit $cislo_vykresu a $datum.

Strávil jsem několik hodin na různých stránkách s regexpama a udělal jsem si na rozbor těch řádků takovýto script

 $reg1= preg_match('w\d{1,9}',$radek_souboru ,$slozka); //cislo slozky
      $reg2= preg_match('[*',$radek_souboru ,$zavorka);   //jestli je zavorka [v retezci a za ni cokoliv
      $reg3= preg_match('-\+-',$radek_souboru ,$folge);   //jakykoliv znaky mezi pomlckama 
      $reg4= preg_match('[okuma]',$radek_souboru ,$stroj);   //jestli je nazev stroje
      $reg5= preg_match('^b\d+-',$radek_souboru ,$cislo_vykresu);   //od zacatku cokoliv co zacina b az po prvni pomlcku
      $reg5= preg_match('\d+\.\d+\.\d+',$radek_souboru ,$datum);   //najit datum cislo tecka cislo tecka cislo
      $reg5= preg_match('\(*$',$radek_souboru ,$komentar);   //od kulate (zavorky az do konce radku 
     

 ale bohužel mi to ani tochu nefunguje prosím Vás o pomoc jak by to mělo být správně

Nahlásit jako SPAM
IP: 89.103.94.–
Reklama
Reklama
lubík
~ Anonymní uživatel
16 příspěvků
9. 12. 2012   #2
-
0
-

#1 lubík
všiml jsem si že jsem špatně popsal proměnné - jsou tam tři proměnné $reg5 ale po opravě ani to nepomhlo pro

správný chod programu

Nahlásit jako SPAM
IP: 89.103.94.–
ench0
Stálý člen
9. 12. 2012   #3
-
0
-

Co se týče toho "si do proměnných uložil každou část oddělenou pomlčkou a pak už je jen správně poskládám a upravené pak vložím" tak by mě zajímalo, zda není lepší si to rovnou ukládat do sloupců v databázi odděleně. Netuším ale k čemu ten kód (string) má sloužit. Viz 1. normální forma (http://cs.wikipedia.org/…atab%C3%A1ze)

Co se týče toho "předem nevím který z těchto dvou řádků vytáhnu z DB"  k tomu by ses měl zamyslet, abys to vždy věděl, který řetězec z databáze taháš. Například dalším sloupcem v DB, který ti říká, o jaký typ toho řetězce se jedná.

"si do proměnných uložil každou část oddělenou pomlčkou a pak už je jen správně poskládám a upravené pak vložím"

na to je super funkce explode() - ta ti zde očividně ale nepomůže. Protože se ti pomlčka vyskytuje v závorkách a mám pocit, že tu závorku nechceš rozdělit. 

Můžeš prosím popsat v čem se liší první řádek od druhého? Je to počtem segmentů oddělených pomlčkami, nebo to je písmenem na začátků těch segmentů či to je v něčem jiném?

Nahlásit jako SPAM
IP: 46.13.114.–
I programování je pudová záležitost. Buď to pude, nebo to nepude
Flowy
~ Anonymní uživatel
448 příspěvků
9. 12. 2012   #4
-
0
-

Docital som sa ze pattern by mal obsahovat delimiter (pravdepodobne pre urcenie jeho tagov) to je pravdepodobne dovod preco ti to nejde 

Ja by som ale pouzil match_all so subpatternmi a tu si celkom jednoducho oddelis slova na zaklade pomlciek a tiez mozes dobre pokrit aj jednotlive riadky

Nahlásit jako SPAM
IP: 178.41.146.–
lubík
~ Anonymní uživatel
16 příspěvků
10. 12. 2012   #5
-
0
-

v DB je takovýchto řádků přes 40 000 a jsou to zápisy mých jkolegů z práce a moje vize je právě taková že by jsem

každou tu část uložil do proměnné a pak je vložil do jednotlivých tabulek aby to bylo pěkně rozsortované jsou to zápisy

archiuvované od roku 1995 v té době nikdo neřešil rozdělování do sloupců a tabulek v té době to zapisovali do office xlsx dokumentu a já jsem to teď poděďil a chtěl bych si to srovnat a dát do DB vše jsemn si už udělal už jen to roztřídění a to nevím jak to udělat na ty delimitery jsem už koukal ale vůbec je nechápu podle mě to jsou znaky na začátku a konci který jsou povinný. když jsem je tam vložil tak už to nic o delimiterech nepsalo ale píše to že Pole na String tady je chyba

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170

Notice: Array to string conversion in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 170
ArrayArrayArrayArrayArrayArray 

těch šest Array za  sebou je výsledek po echu všech proměnných ,dal jsem si všechny proměnný vypsat a místo jednotlivých částí toho řádku to vypsalo jen Array ,tady netuším proč to píše že převádím pole na string??, jediný kde s Polem pracuji ,je ten řádek a ten jsem z DB vytáhl pomocí pole  kód je asi takovýto

      $dotaz= "SELECT vykresy FROM rok2012 WHERE vykresy LIKE '%$hledany_text%'";        
       $sql=mysql_query($dotaz)or die (mysql_error());
     $num=0;
                      //cyklus
   while($r=mysql_fetch_array($sql)) {
     $r["vykresy"];
     $num++;
     $radek_souboru=$r["vykresy"];          
               
                 $reg1= preg_match('/w\d{1,9}/',$radek_souboru ,$slozka); //cislo slozky
      $reg2= preg_match('/[*/',$radek_souboru ,$zavorka);   //jestli je zavorka [v retezci a za ni cokoliv
      $reg3= preg_match('/-\+-/',$radek_souboru ,$folge);   //jakykoliv znaky mezi pomlckama 
      $reg4= preg_match('/[okuma]/',$radek_souboru ,$stroj);   //jestli je nazev stroje
      $reg5= preg_match('/^b\d+-/',$radek_souboru ,$cislo_vykresu);   //od zacatku cokoliv co zacina b az po prvni pomlcku
      $reg6= preg_match('/\d+\.\d+\.\d+/',$radek_souboru ,$datum);   //najit datum cislo tecka cislo tecka cislo
      $reg7= preg_match('/\(*$/',$radek_souboru ,$komentar);   //od kulate (zavorky az do konce radku
         echo $slozka.$zavorka.$folge.$stroj.$cislo_vykresu.$datum.$komentar; 
          
Nahlásit jako SPAM
IP: 89.103.94.–
lubík
~ Anonymní uživatel
16 příspěvků
10. 12. 2012   #6
-
0
-

ještě jsem tam zapoměl dokopírovat chybu která patří k těm ostatním šesti


Warning: preg_match() [function.preg-match.html]: Compilation failed: missing terminating ] for character class at offset 2 in C:\Complex-Web-Server-2\www\programatori\mlaticka\vyhledej_zapis.php on line 164

tahle chyba se objeví jako první
 

Nahlásit jako SPAM
IP: 89.103.94.–
ench0
Stálý člen
10. 12. 2012   #7
-
0
-

 Zkusil jsem si pohrát s tím regulárním výrazem. Jelikož jsi mi neodpověděl na otázku, tak předpokládám, že se to nebude dát zcela použít, ale mělo by tě to snad popostrčit dál. Použil jsem tam pojmenování subvýrazů (či jak se tomu říká) tudíž můžeš jednotlivé části toho řetězce volat například takto: $matches['cislo_vykresu'] :)

Další věc je, že máš v těch regulárech chyby. Např. '[*' znamená libovolný počet výskytů levých hranatých závorek :) Místo toho bys měl použít toto" '[.*' (tečka znamená jakýkoli znak a hvězdička libovolný počet výskytů. - tedy všechny znaky za levou hranatou závorkou.

Tady je ten kód. Zkusil jsem si to u sebe na těch dvou řetězcích a ten druhý má $matches['slozka'] == "" - což je jediná odlišnost, kterou jsem vydedukoval z těch dvou ukázek. Ještě předpokládám, že stroj má začínat na 'dmg' - toto se vyskytuje opět v obou případech. 

$reg = '/^(?P<cislo_vykresu>\w+)\-(?P<folge>\w+)(\-(?P<slozka>\w+))?\-(?P<stroj>dmg\w+)\-(?P<datum>\d{1,2}\.\d{1,2}\.\d{1,2}).{1}(?P<poznamka>.*)$/';

$radek_souboru = "B14956-H39406-W71-dmg80-13.3.12 (+podložka)";
preg_match($reg, $radek_souboru, $matches);
var_dump($matches);

$radek_souboru = "120366-4064-dmg35-16.3.12 [opak. W56-114660] (podložka)";
preg_match($reg, $radek_souboru, $matches);
var_dump($matches);
Nahlásit jako SPAM
IP: 77.242.90.–
I programování je pudová záležitost. Buď to pude, nebo to nepude
lubik
~ Anonymní uživatel
16 příspěvků
10. 12. 2012   #8
-
0
-

Dík moc určitě to vyzkouším v tom druhým řádku mi stačí vědět jen jestli tam je ta zaávorka a pak změním jen číslo výkresu a datum. Rozdíl mezi řádkama je v tom že ten první řádek má tvar který odpovídá tomu že se u nás ve firmě tento kus vyráběl jen jednou a program pro cnc frézu je uložen v takovémto tvaru a ten druhý řádek znamená že takový kus se u nás ve firmě vyráběl více nežli jednou a tvar řádku je s hranatýma závorkama .Já buď dostanu z DB řádek jednoho nebo druhého tvaru a podle toho který řádek dostanu tak podle toho ho přetřídím a pak zase vložím do DB .Myslím že to co jsi napsal mi určitě bude vyhovovat předem moc díky a večer to určitě vyzkouším

Nahlásit jako SPAM
IP: 85.207.55.–
Flowy
~ Anonymní uživatel
448 příspěvků
11. 12. 2012   #9
-
0
-

Pouzivas preg match kde si zadal nazov !tabuliek! kde sa maju vysledky pouzit (uklada sa viac udajov ako sa ti zda pozri si priklady funkcie) v echo s tym pracujes ako so stringom ... To je asi problem ale php nepoznam

Ak by si pouzil match all (dalo by sa aj na cely dokument ale jednoduchsie bude asi na riadok ak sa moc nemusis s regex) tak by si mohol jednoduchsie rozlisovat jednotlive casti pretoze by si definoval jednoducho deliace znaky a ono by ti to vratilo zoradene vyrazy v tabulkach

Regex je velmi uzitocna vec pri praci s textom odporucam naucit sa syntax potom to uz neni zlozite

Nahlásit jako SPAM
IP: 178.41.234.–
lubík
~ Anonymní uživatel
16 příspěvků
11. 12. 2012   #10
-
0
-

Díky moc ENCH . Pro moje účely to funguje absolutně přepichově už jsem to vyzkoušel a jsem moc spokojený, dokonce mi došlo pár věcí který jsem si nedikázal dát do souvislosti a flowy měl pochopitelně pravdu -takhle se pole nevypisuje všem díky

Nahlásit jako SPAM
IP: 89.103.94.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 162 hostů

Podobná vlákna

Regularni vyrazy — založil Vyhulman

Regulární výrazy — založil Sony

Regulární výrazy — založil Míša

Regulární výrazy — založil polonium

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý