Autor Zpráva
WagoOn
Profil *
Ahoj vsem

potreboval bych pomoct s regularnim vyrazem, ktery rozparsuje nasledujici string. (Jedna se vlastne o parsovani jednoducheho xpath vyrazu, ale to neni dulezite)

retezec, ktery potrebuju rozparsovat na pole (tj.vice retezcu)
/root/uzel[@id=/root/data[@parametr=10]/@id]/poduzel[@id=99]/@value

vysledek by mel vypadat takto
/root
/uzel[@id=/root/data[@parametr=10]/@id]
/poduzel[@id=99]
/@value
dwda

jaka jsou pravidla: (xpath znalci mohou preskocit:)
xpath vyraz by se dal laicky prirovnat k zapisu cesty k nejakemu souboru na disku. V mnou uvedenem pripade by se tedy jednalo naprikad o soubor value ktery je umisteny na c:\root\uzel\poduzel\

to co je v xpath vyraze umisteno v hranatych zaovrak, je v podstate takova podminka
napriklad vyraz soubor[@velikost=50kb] vybere vsechny "soubory" (uzly) ktere maji velikost 50kb (v xpath vyraze vybere uzel, ktery ma atribut velikost roven textu "50kb")

V cem je tedy problem?
Potrebuji regularni vyraz, ktery mi vrati jednolive uzky a podminku, ktera k nemu patri.

Regularni vyraz ktery mam nyni hotovy funguje jednoduse. Hleda retezce, ktere zacinaji lomitkem, nasleduji znaky a-z,0-9, pak nasleduje zacatek podminky"[" text a konec podminky"]". Problem je ale v tom, ze v podmince "[...]" mohou byt taky hranate zavorky. Jde tedy o to (asi) jak kontrolovat pocet zavorek.

Budu moc vdecny za jakoukoli pomoc. Regularnim vyrazum moc nerozumim.

WagoOn
Peca
Profil
Pokud mě paměť neklame, tak regulární jazyk neumožňuje kotrolovat paritu závorek.
Ale na druhou stranu v tom nevidím velký problém. Stačí napsat jednoduchou funkci, které bude vracet požadovaný výsledek.
Peca
Profil
Je to dělané na rychlo, tak to podle toho vypadá. Ale zhruba podobné výsledky to háže.

$r=parse("/root/uzel[@id=/root/data[@parametr=10]/@id]/poduzel[@id=99] /@value");
echo implode("<br>",$r);

function parse($s)
{
$r=array();
$poc=0;
$a='';
for ($i=0;$i<strlen($s);$i++)
{
if ($s[$i]=='[')
$poc++;
if ($s[$i]==']')
$poc--;
if ($s[$i]=='/' && $poc==0 && strlen($a)>1)
{ $r[]=$a; $a='/'; }
else
$a.=$s[$i];
}
$r[]=$a;
return $r;
}
peta
Profil *
Peca Ciste nahodou nebyla rec o javascriptu? :)

WagoOn
x = "c:\root\uzel\poduzel\".split('\');
/*
x = [
"c:",
"root",
"uzel",
"poduzel",
""
];
nebo tez
x[0]="c:"; x[1]=...
*/

Problem je, ze ty mas v podmince lomitka, takze by mozna bylo dobre lomitka v podmince nahradit regularnim vyrazem hledajici vsechny lomitk v "[" ... "]" na neco jineho, treba opacna, pak split a pak lomitka zpet.
http://www.visibone.com/javascript/
Toto téma je uzamčeno. Odpověď nelze zaslat.

0