Autor | Zpráva | ||
---|---|---|---|
PetrKa Profil * |
Ahoj
mohl by mi někdo poradit jak získat z těchto řetězců libovolné slovo? mám dvě situace 1) raz:dva&tri 2) raz&dva:tri Potřebuji získat slovo, které je A) mezi začátkem řetězce a ':' B) nebo mezi ':' a koncem řetězce A potom potřebuji získat to slovo, které je uprostřed mezi ':' a '&' neboli mezi '&' a ':' … místo raz, dva, tři si můžete dosadit jakékoli jiné slovo Moderátor Joker: Titulek „regulární výraz“ je moc obecný. Příště zkus prosím vymyslet lepší.
|
||
H13 Profil |
#2 · Zasláno: 16. 8. 2010, 00:56:31 · Upravil/a: H13
Použij PHP funkci explode, příklad (je to jen jednoduchej příklad, bez kontrol (jestli je pole prázdný, atd.), místo polí můžeš použít objekty, nemusíš žádat hodnotu, která je samostatná a nerozdělitelná (u amp), atd. atd.):
<?php $retezce = array('Prvni retezec' => 'raz:dva&tri', 'Druhy retezec' => 'raz&dva:tri'); $vysledky = array(); foreach ($retezce as $klic => $hodnota) { $vysledky[$klic]['dvojtecka'] = explode(':', $hodnota); // První řetezec rozdělenej na: "raz", "dva&tri" foreach($vysledky[$klic]['dvojtecka'] as $klicDvojtecka => $hodnotaDvojtecka){ // První řetezec na "raz" a na "dva","tri" $vysledky[$klic]['amp'][$klicDvojtecka] = explode('&', $hodnotaDvojtecka); } } print_r($vysledky); ?> Výstup: Array ( [Prvni retezec] => Array ( [dvojtecka] => Array ( [0] => raz [1] => dva&tri ) [amp] => Array ( [0] => Array ( [0] => raz ) [1] => Array ( [0] => dva [1] => tri ) ) ) [Druhy retezec] => Array ( [dvojtecka] => Array ( [0] => raz&dva [1] => tri ) [amp] => Array ( [0] => Array ( [0] => raz [1] => dva ) [1] => Array ( [0] => tri ) ) ) ) které je A) mezi začátkem řetězce a ':' B) nebo mezi ':' a koncem řetězce Array ( [0] => raz [1] => dva&tri ) které je uprostřed mezi ':' a '&' neboli mezi '&' a ':' Array ( [0] => dva [1] => tri ) ) |
||
PetrKa Profil * |
#3 · Zasláno: 16. 8. 2010, 08:41:01
H13:
Hm, jenže já pracuju v JS takže to potřebuju v JS. Tj. na straně klienta. |
||
PetrKa Profil * |
#4 · Zasláno: 16. 8. 2010, 08:41:56
Ale když bych to dělal v PHP raději bych použil regulární výraz. v JS neumím
|
||
Chamurappi Profil |
#5 · Zasláno: 16. 8. 2010, 09:38:16
Reaguji na H13:
Viz kategorie. Reaguji na PetraK: „Potřebuji získat slovo, které je A) mezi začátkem řetězce a ':' B) nebo mezi ':' a koncem řetězce“ Tady by bylo lepší použít řetězec.split(":") . Ale jestli trváš na regulárním výrazu, tak řetězec.match(/^([^:]+):(.*)$/) .
„získat to slovo, které je uprostřed mezi ':' a '&' neboli mezi '&' a ':'“ řetězec.match(/[:&]([^:&]+)[:&]$/)[1] , pokud nevadí, že to zaměří i slovo mezi dvěma ampersandy nebo dvěma uvozovkami.
|
||
PetrKa Profil * |
#6 · Zasláno: 16. 8. 2010, 09:47:26
Chamurappi:
Díky, tak já to nějak vyzkouším |
||
Joker Profil |
#7 · Zasláno: 16. 8. 2010, 09:53:32
PetrKa:
Případně nestačilo by jeden z těch symbolů nahradit za ten druhý (například „&“ -> „:“) a potom to rozdělit metodou split? |
||
PetrKa Profil * |
#8 · Zasláno: 16. 8. 2010, 10:28:21
Možná bych to nakonec udělal jinak. To co je před ampersandem a za je vždy významově jedno a to samé (pořadí se nemění).
wordVal = "raz:dva&tri"; wordVal = "raz&dva:tri"; word = wordVal.match(/(\w*)&(\w*)/); console.log(word); A teď jen určit to poslední slovo. U toho slova kde je dvojtečka navíc potřebuju vědět jestli je to slovo na začátku nebo na konci Tak tady je kompletní řešení: lastWord = null; wordVal = "raz&dva:tri"; wordVal = "raz:dva&tri"; word = wordVal.match(/(\w*)&(\w*)/); console.log(word); lastWordOnBegin = wordVal.match(/^(\w*):.*/); if (lastWordOnBegin) lastWord = {'where':"^", 'value':lastWordOnBegin[1] } else { lastWordOnEnd = wordVal.match(/.*:(\w*)$/); if (lastWordOnEnd) lastWord = {'where':"$", 'value':lastWordOnEnd[1] } } if (lastWord.where=="^") console.log(lastWord.value+" on begin"); else if (lastWord.where=="$") console.log(lastWord.value+" on the end"); else console.log("None last word was not found"); Druhý a třetí řádek je možno přehodit |
||
Joker Profil |
#9 · Zasláno: 16. 8. 2010, 11:23:34
PetrKa:
To řešení mi přijde nějaké překomplikované. „ampersandem a za je vždy významově jedno a to samé (pořadí se nemění) … U toho slova kde je dvojtečka navíc potřebuju vědět jestli je to slovo na začátku nebo na konci“ Tedy jestli jsem to pochopil, jde o to získat slovo před dvojtečkou plus informaci, jestli se nachází před ampersandem nebo za. Udělal bych to nějak takhle: var wordVal = "raz&dva:tri"; var wList = wordVal.split(":"); var found = (wList.length > 1); // Byla nějaká dvojtečka? Nebo podmínka == 2 by poslala do chyby i více dvojteček if(found) { var word = wlist[0]; var wordBeginning = true; if(word.indexOf("&") > 0) // nebo >=0 pokud by ampersand mohl být i na začátku, např "raz:&tri" { wordBeginning = false; word = word.split("&")[1]; } } else { … // nenalezeno } // word = slovo, found = true pokud bylo nalezeno, wordBeginning = true pokud nalezeno na začátku, false pokud na konci |
||
H13 Profil |
#10 · Zasláno: 16. 8. 2010, 11:47:14
PetrKa:
„Hm, jenže já pracuju v JS takže to potřebuju v JS. Tj. na straně klienta.“ Sorry, kategorii jsem totálně přehlídl :-) |
||
PetrKa Profil * |
#11 · Zasláno: 16. 8. 2010, 11:59:31
Joker:
Standardně dvojtečka ukazuje na slovo které je na okraji toho řetězce. Může to tedy být na začátku nebo na konci. |
||
Časová prodleva: 15 let
|
0