Autor Zpráva
johnCena
Profil *
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 *
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
smiesek [#4]:
PHP regex delimiter, what's the point? - Stack Overflow
anonymníí
Profil *
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
anonymníí:
co znamená ?:
Viz php.net/manual/en/regexp.reference.subpatterns.php, jedná se o non-capturing subpattern.
tiso
Profil
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
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
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.
~ je zrejme delimiter preštuduj si stránku http://www.regularnivyrazy.info/php-pcre-perl-compatible.html
anonymníí
Profil *
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);
a
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
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
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
[#15]:
explode() lze předat volitelný 3. argument limit,
explode(' ', $input, 6)[5];
Jediná věc, která tady není dořešená, je (nevalidní) vstup obsahující menší počet mezer.
Keeehi
Profil
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
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
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.

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: