Autor | Zpráva | ||
---|---|---|---|
johnCena Profil * |
#1 · Zasláno: 20. 7. 2015, 21:02:40
dobry vecer,
mam nasledujuci string: "1111 9999999 22456 123 412 3156 8456 13265" a ja potrebujem z toho stringu dostat znaky za piatou medzerou - 3156 8456 13265. ako to mam urobit? nenapada ma ako cez explode, lebo ked explodnem pomocou medzery (explode(" ", string);) tak mi to vypise len jedno slovo/cislo vdaka |
||
Keeehi Profil |
preg_match('~^(?:[^ ]+ ){5}(.*)$~', $input, $matches); print_r($matches); Nebo ten vstup prostě projít cyklem písmenko po písmenku, napočítat 5 mezer a pak všechny zbývající písmenka vypsat. |
||
johnCena Profil * |
#3 · Zasláno: 20. 7. 2015, 21:20:59
vdaka
|
||
smiesek Profil |
Keeehi
několikrát jsem již na to narazila, nemůžu dohledat a dočíst se, co znamená a nebo jaký má smysl použití ohraničení ~ regulárního výrazu? Stejně tak jako můžete prosím napsat logiku vytvoření podmínky? Nemůžu pochopit (?:[^ ]+ ). Chápu to tedy tak, že tam nesmí být ta mezera což značí [^ ], pak k tomu jako předcházející znak min 1x nemůže být taky mezera + ) a to před (?: nevím Děkuju |
||
Alphard Profil |
#5 · Zasláno: 21. 7. 2015, 03:06:09
|
||
anonymníí Profil * |
#6 · Zasláno: 21. 7. 2015, 08:18:04
Alphard:
Děkuji za reakci na smiesek, na kterou jsem taky čekal. Odpověděl jsi pouze na delimitery, ale co znamená ?: ? To vídám u pro mě složitějších regexpů častěji, ale nikde jsem se nedočetl, co to je (asi nevím, co hledat, jak to pojmenovat).
Smiesek se na to také ptal, jen k tomu přidal i počáteční kulatou závorku, která k tomu nepatří. Díky za doplnění. |
||
Jan Tvrdík Profil |
#7 · Zasláno: 21. 7. 2015, 09:12:55
anonymníí:
„co znamená ?: “
Viz php.net/manual/en/regexp.reference.subpatterns.php, jedná se o non-capturing subpattern. |
||
tiso Profil |
#8 · Zasláno: 21. 7. 2015, 10:13:12
smiesek: viď www.regularnivyrazy.info/shrnuti-syntaxe.html
"?:" je "uzávorkování netvořící zpětnou referenci" - takáto zátvorka sa nevracia vo výsledku "[^ ]+" je minimálne jeden znak iný ako medzera " " je medzera Takže dokopy je to skupina znakov s medzerou na konci, ktorá ale nebude vybraná vo výsledku |
||
smiesek Profil |
#9 · Zasláno: 21. 7. 2015, 13:36:16
tiso:
pochopila jsem tedy správně, že "?:" vrátí vše, kromě výsledku té závorky? v tom odkazu právě nechápu český smysl významu věty "uzávorkování netvořící zpětnou referenci" A ještě prosím tedy ~ vlnovka značí co? |
||
tiso Profil |
#10 · Zasláno: 21. 7. 2015, 13:43:29
smiesek: každý výraz vo vnútri zátvoriek
() je vrátený do výsledku. Ale občas potrebuješ zátvorkami ohraničiť výraz, ale nepotrebuješ ho vrátiť, vtedy sa používa táto konštrukcia.
Tá ~ je zrejme delimiter preštuduj si stránku http://www.regularnivyrazy.info/php-pcre-perl-compatible.html
|
||
anonymníí Profil * |
#11 · Zasláno: 21. 7. 2015, 13:51:30 · Upravil/a: anonymníí
smiesek:
Po Tisově a Honzově vysvětlení už jsem to pochopil aj já. Zkus a sleduj rozdíly v dumpu. preg_match('~^(?:[^ ]+ ){5}(.*)$~', $input, $matches); print_r($matches); preg_match('~^([^ ]+ ){5}(.*)$~', $input, $matches); print_r($matches); Jako delimiter může být použito cokoliv, pokud se v patternu daný znak objeví, musí být escapován. Vše následující vrátí totéž, pokaždé to má jen jiný delimiter. preg_match('~^(?:[^ ]+ ){5}(.*)$~', $input, $matches); preg_match('#^(?:[^ ]+ ){5}(.*)$#', $input, $matches); preg_match('/^(?:[^ ]+ ){5}(.*)$/', $input, $matches); |
||
smiesek Profil |
#12 · Zasláno: 21. 7. 2015, 15:19:50
no já jsem úplně v háji, začala jsem si tedy procházet celou problematiku regulárních výrazů a když mi nejde ani následující základ:
$regularni_vyraz = "/^[0123456789]$/"; $testovany_retezec = "025"; if (preg_match($regularni_vyraz, $testovany_retezec)) { echo "Vyhovuje :)"; } else { echo "Nevyhovuje :("; } pořád nevyhovuje. , tak nemohu pak pochopit taky ty složitější výrazy a ještě ke všemu něco sama tvořit :( |
||
Kcko Profil |
$regularni_vyraz = "/^[0123456789]+$/"; Jinak jsi si to nenastudovala dostatečně. To jsou kvantifikátory, určují kolik tam toho může být ... => ? nebo * nebo + nebo rozsah {m,n} Já te rozhodně nechci urazit, ale po tom co jsem si pročetl několik tvých záseků zcela jistě vím, že Ti programovaní nikdy moc nepůjde, logické myšlení moc nemáš. Něco se jde samozřejme nadrtit a neustálým zkoušením, psaním a procvičováním lze překlenout základní úroveň, ale dál se stejně nedostaneš. Nezlob se ... PS. Český tutorial |
||
smiesek Profil |
Kcko:
neurazil a nejste první, kdo mi to tvrdí, já se však bohužel za tu pravdu snažím "bí/ýt" a snažím pochopit, než přijmout prohru :( Tak se s každým zde vloženým dotazem modlím, aby mě uživatelé neposlali pryč - že jde o zcela základní věci (z jejich pohledu). Snažím se na to vytvářet vlastní příklady, aby to nebylo způsobem podívám se, vidím a ono to prostě tak funguje a bude fungovat. Nechci se to právě nadrtit, ale pochopit vždy. Děkuju za opravu, nyní to je zřejmé, stejně tak jako vysvětlení delimiterů. |
||
mimochodec Profil |
#15 · Zasláno: 21. 7. 2015, 16:30:55
Jen aby to nevypadalo, že se to bez regulárů neobejde.
$input = "1111 9999999 22456 123 412 3156 8456 13265"; $output = implode (" ", array_slice(explode (" ", $input), 5)); echo $output; |
||
Alphard Profil |
#16 · Zasláno: 21. 7. 2015, 17:01:05
|
||
Keeehi Profil |
#17 · Zasláno: 21. 7. 2015, 19:04:03
smiesek:
Já bych se ještě vyjádřil k tomu, proč používám v regulárech vlnovku a ne lomítko. Je to právě kvůli tomu, že to může být jakýkoli znak. Ale pokud ten znak chci použít i uvnitř reguláru, musím ho escapocat. No a abych musel escapovat co nejméně, tak používám vlnovku, protože se mi v regulárech prakticky nikdy nevyskytuje kdežto lomítko ano. Jiný důvod v tom není. |
||
smiesek Profil |
#18 · Zasláno: 22. 7. 2015, 05:56:19
Keeehi:
to je dobrý důvod. Přesto s tím budu ještě hodně bojovat :( Návody jsou psány pro inteligentnější než pro mimina :( |
||
smiesek Profil |
jak mám prosím rozumnět následujícímu, když mi to prostě podle toho, co se píše nefunguje? Tedy funguje pouze část, pak tedy opět nechápu, i když já ještě nic nikdy nepochopila, kdy použít
[]
$regularni_vyraz = "/Deš?ník/"; $testovany_retezec = "Deník"; neprojde, musím to dát do [] pak to projde $regularni_vyraz = "/De[š]?ník/"; $testovany_retezec = "Dešník"; neprojde, musím to dát bez [] pak to projde Očekávala bych stejné a jednotné chování ať už bude obsahem š a nebo nebude a nikoliv ještě rozlišovat, kdy to dát do [] a kdy nikoliv, samozřejmě vím, a dočetla jsem se, že [] slouží pro výčet skupiny znaků Takže to nechápu a koukám na to jako pokus omyl a ono to nějak bude fungovat, ale logika nulová :( |
||
juriad Profil |
smiesek:
<?php $regex = "/Deš?ník/"; $tests = array("Deík", "Deník", "Dešník", "Deštník"); foreach ($tests as $test) { echo "Testing $test:\n"; echo "Without u modifier: ", preg_match($regex, $test), "\n"; echo "With u modifier: ", preg_match($regex . "u", $test), "\n"; echo "\n"; } Protože písmeno š není podle regulárních výrazů jedno písmeno, ale je to sekvence dvou bytů (kvůli reprezentaci v UTF-8). Při používání dikaritiky v regexech musíš použít modifikátor u. (Je to složitější, záleží na kódování souboru a nejspíš i na nastaveném kódování regexů, viz php.net/manual/en/function.mb-regex-encoding.php) |
||
smiesek Profil |
#21 · Zasláno: 23. 7. 2015, 06:33:04
juriad:
děkuju, už zatím funguje |
||
MSTRmt Profil |
<?php $vysledek = explode(" ", $input); unset($vyslede5[0]); unset($vysledek[1]); unset($vysledek[2]); unset($vysledek[3]); unset($vysledek[4]); foreach($vysledek as $klic => $hodnota { echo $hodnota, " "; }; ?> |
||
lionel messi Profil |
MSTRmt:
Zbytočné, chybné a príliš nehodnotné, pokojne by som zmazal. 1. Na 3. riadku máš preklep: unset($vyslede5[0]); (definuješ $vysledek ), ktorý bude generovať poznámku a navyše spôsobí zlú funkčnosť kódu (zo vstupu 1 2 3 4 5 6 zostane nesprávne 16 ).
2. Armáda unset -ov je podľa môjho laického názoru úplne zbytočná, johnCena veľmi dobre vie, že potrebuje iba údaje za 5. medzerou, čo mu nebráni použiť:
<?php $input = "1 2 3 4 5 6"; $vysledek = explode(" ", $input); echo $vysledek[4]; //vypíše správne 6 }; ?> 3. V nepotrebnom cykle foreach úplne zbytočne ukladáš informáciu o indexoch prvkov poľa.
|
||
Časová prodleva: 9 let
|
0