Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP regulární výraz

Ahoj, už se tu 2 dny morduju s jedním regulárním výrazem v PHP (PCRE), cílem je najít v řetězci toto, uvedu příklad:
<%%#Zájmy#zajmy$>Nějaký obsah</zajmy>
Známe jenom slovo zajmy, víc nic
Ale pozor, ty znaky %% a $ v prvním tagu můžou či nemusí být, takže o to je to složitější, zatím jsem se dostal k tomuto ($key je proměnná, kterou známe):

/<(.*)\#(.*)\#$key(\$|)>(.*)<\/$key>/

To ale někdy vyplivne toto:

<#Jídlo#jidlo$> <#Pití#piti$> <#Barva#barva$> <#Hudební styl#hudebnistyl$> <#Kapela#kapela$> <#Televize#televize

Díky za odpověď.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Aku funkciu pouzivas na analyzu tym regexom? Ptz moze byt fcia ktora vrati vsetky vyskyty toho co ta… nový
MM.. 05.06.2009 20:39
MM..
Inac toto (\$|) ma aky vyznam? $ alebo nic ci jak? :) Ked chces $ alebo nic, tak by som radsej pouzi… nový
MM.. 05.06.2009 20:51
MM..
Vyřešeno? Bylo by slušnost napsat jak? nový
host 06.06.2009 12:50
host
Já to ještě dolaďoval, aby to vypadalo nějak normálně ten výraz: /<(%*)\#([a-zA-Z0-9ěščřžýáíéťňůú\!… nový
marekdrtic 06.06.2009 12:59
marekdrtic
omg to preco tam vymenovavas tie znaky, nestaci ta negacia? :) Ale ok, ako chces. Ale sa mi zda ze t… nový
MM.. 06.06.2009 13:48
MM..
/<(%*)\#([^\<\>])\#$key(\$|)>([^<>]*)<\/$key>/ Toto mi tam jaksi nefunguje nový
marekdrtic 06.06.2009 13:51
marekdrtic
Nedal si tam hviezdicku (0 az nekonecno takych znakov) A <> myslim nepotrebuju \ nový
MM.. 06.06.2009 13:52
MM..
/<(%*)\#([^<>]*)\#$key(\$?)>([^<>]*)<\/$key>/ nový
MM.. 06.06.2009 13:54
MM..
Nefunguje a nechápu proč, ještě pro upřesnění, má to hledat třeba takovýto řetězec: <%%#Text plný h… nový
marekdrtic 06.06.2009 14:02
marekdrtic
Ale v tom tvojom co pises ze ti funguje na 100% mas predsa tiez uz ([^<>]*) Takze tato cast funguje… nový
MM.. 06.06.2009 14:27
MM..
Inac ten co akoze "funguje na 100%" je uplne zle, chyba tam jedno ], takze ten bude brat cokolvek ni… nový
MM.. 06.06.2009 14:31
MM..
Skus to co som pisal na nejaky link bez hackov a carkov. nový
MM.. 06.06.2009 14:33
MM..
Este nie som si isty ci tam nejak nepouzivas blbo tie zatvorky, skus /<%*\#[^<>]*\#$key\$?>[^<>]*<\… nový
MM.. 06.06.2009 14:38
MM..
ne, ty závorky tam musí být, jinak to nefunguje vůbec a hází chybu, že je špatný ten regex. nový
marekdrtic 06.06.2009 14:44
marekdrtic
Presne to si skopiroval co som tu vlozil a pise ti ze je spatny ragex? Kto kde ti to pise? Nechcelo… nový
MM.. 06.06.2009 14:47
MM..
Pouizvas funkciu ereg? Ak ano tak vyhod to / na zaciatku a na konci a aj to \ pred / nový
MM.. 06.06.2009 14:52
MM..
používám preg. nový
marekdrtic 06.06.2009 14:59
marekdrtic
A vyhod aj tie \ pred #. # neni specialny znak. nový
MM.. 06.06.2009 14:55
MM..
Toto urcite funguje mam to otestovane <?php $key = 'text'; $string = '<%%#Text plný háčků a čárek#t… nový
MM.. 06.06.2009 15:23
MM..
Díky moc za trpělivost, s tím ereg to funguje :beer::beer: nový
marekdrtic 06.06.2009 15:37
marekdrtic
Funguje to urcite aj s preg, ked sa to urobi poriadne ;-) Ok, neni zac. poslední
MM.. 06.06.2009 15:41
MM..
Ked nechces regex skladat, tak toto funguje urcite (mam otestovane): <?php $key = 'text'; $string =… nový
MM.. 06.06.2009 15:30
MM..
Inac nabuduce ked ti nieco nefunguje tak hladaj pricinu zjednodusovanim. T.j. mas nejaky program tes… nový
MM.. 06.06.2009 15:32
MM..

Aku funkciu pouzivas na analyzu tym regexom? Ptz moze byt fcia ktora vrati vsetky vyskyty toho co tam pasuje.

Ale najskor to bude tento problem:
<#Jídlo#jidlo$> a tu strasne vela vela vela kravin a na konci <#Jídlo#jidlo$></jidlo>

co sa moze stat ak sa nachadza ten link v stringu dvakrat. A to splna ten tvoj REGEX.
V tom pripade napr. ma napada ze si mozes obmedzit to
(.*)
cim testujes ten "Nejaky obsah" v linku tak, ze tam NESMIE byt < ani >
To sa v regexe da, ([^ neco]), vid napr. Regular_expression
T.j. ak sa nemylim tak namiesto toho (.*) daj ([^<>]*)

... alebo som nepochopil ze jaky presne mas problem. :-)

P.S. podobne by som asi obmedzil aj tie prve dve vyskyty toho (.*), ono to moze byt dost nebezpecne (ptz do toho pasuje cokolvek a teda vezme prve <, potom miliardu blbosti, a potom tvoj link). Chapes? Musis to obmedzit (idealne na %*, ked tam moze byt (0 az nekoneco) znakov %, ale nic ine). A to druhe (.*) zmenit tiez na [^<>]*

Toto urcite funguje mam to otestovane

<?php
$key = 'text';
$string = '<%%#Text plný háčků a čárek#text$>Text s háčky a čárkami</text>';
$regex = '<%*#[^<>]*#'.$key.'\$?>[^<>]*</'.$key.'>';

if( ereg($regex, $string, $regs) )
{
 $vypisat = htmlspecialchars($regs[0]);
 echo $vypisat;
}
else
{
 echo "Nepasuje";
}
?>

Schavlne ten regex skladam a pouzivam jednoduche uvodzovky, aby nevznikali problemy s tymznakom $, ten je tam najproblemovejsi.

Ziadne zatvorky netreba. Zatvorky sa u ereg v PHP pouzivaju tusim na to aby si rozdelil string do podpoli (podpolia by boli potom v $regs[1] , $regs[2], ... atd)

Ked nechces regex skladat, tak toto funguje urcite (mam otestovane):

<?php
$key = 'text';
$string = 'blablabla<%%#Text plný háčků a čárek#text$>Text s háčky a čárkami</text>blablabla';

if( ereg("<%*#[^<>]*#$key\\$?>[^<>]*</$key>", $string, $regs) )
{
 $vypisat = htmlspecialchars($regs[0]);
 echo $vypisat;
}
else
{
 echo "Nepasuje";
}
?>

Pred $ musia byt dve \, pretoze jedno odstrani PHP (kvoli "" stringu a druhe porebuje REGEX.

Inac nabuduce ked ti nieco nefunguje tak hladaj pricinu zjednodusovanim.
T.j. mas nejaky program testovaci a z niecoho co je moc zlozite (u nas ten regex) vyhadzujes postupne veci ktore sa ti mozu zdat nebezpecne (ja som zacal tym $ :-)) a samozrejme prislusne upravis aj vstup (aby bol jednoduchsi) a testujes az kym to zacne pracovat tak ako predpokladas. ;)

Zpět do poradny Odpovědět na původní otázku Nahoru