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ěď.

Předmět Autor Datum
Proč regulární výraz? Nestačí na to řetězcové funkce, např. strpos? Nebo asi nechápu podstatu problé…
host 05.06.2009 15:03
host
Já bych to raději řešil tím regulárním výrazem, protože se to tím zjednoduší, to strpos bych nechal…
marekdrtic 05.06.2009 15:11
marekdrtic
V čem spočívá to zjedodnušení?
host 05.06.2009 19:19
host
Aku funkciu pouzivas na analyzu tym regexom? Ptz moze byt fcia ktora vrati vsetky vyskyty toho co ta…
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…
MM.. 05.06.2009 20:51
MM..
Vyřešeno? Bylo by slušnost napsat jak?
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ěščřžýáíéťňůú\!…
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…
MM.. 06.06.2009 13:48
MM..
/<(%*)\#([^\<\>])\#$key(\$|)>([^<>]*)<\/$key>/ Toto mi tam jaksi nefunguje
marekdrtic 06.06.2009 13:51
marekdrtic
Nedal si tam hviezdicku (0 az nekonecno takych znakov) A <> myslim nepotrebuju \
MM.. 06.06.2009 13:52
MM..
/<(%*)\#([^<>]*)\#$key(\$?)>([^<>]*)<\/$key>/
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…
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…
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…
MM.. 06.06.2009 14:31
MM..
Skus to co som pisal na nejaky link bez hackov a carkov.
MM.. 06.06.2009 14:33
MM..
Este nie som si isty ci tam nejak nepouzivas blbo tie zatvorky, skus /<%*\#[^<>]*\#$key\$?>[^<>]*<\…
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.
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…
MM.. 06.06.2009 14:47
MM..
Pouizvas funkciu ereg? Ak ano tak vyhod to / na zaciatku a na konci a aj to \ pred /
MM.. 06.06.2009 14:52
MM..
používám preg.
marekdrtic 06.06.2009 14:59
marekdrtic
A vyhod aj tie \ pred #. # neni specialny znak.
MM.. 06.06.2009 14:55
MM..
Toto urcite funguje mam to otestovane <?php $key = 'text'; $string = '<%%#Text plný háčků a čárek#t…
MM.. 06.06.2009 15:23
MM..
Díky moc za trpělivost, s tím ereg to funguje :beer::beer:
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 =…
MM.. 06.06.2009 15:30
MM..
Inac nabuduce ked ti nieco nefunguje tak hladaj pricinu zjednodusovanim. T.j. mas nejaky program tes…
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