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
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 *
H13:
Hm, jenže já pracuju v JS takže to potřebuju v JS. Tj. na straně klienta.
PetrKa
Profil *
Ale když bych to dělal v PHP raději bych použil regulární výraz. v JS neumím
Chamurappi
Profil
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 *
Chamurappi:
Díky, tak já to nějak vyzkouším
Joker
Profil
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 *
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
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
Moc to neřeší nestandardní situace, například když vstup bude ":::" (tohle viz komentář v kódu) nebo "a:b&c&d&e&f" a podobně.
H13
Profil
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 *
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.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0