Autor Zpráva
daop
Profil *
Dobry den,
potrebuji pomoc jak jednoduse udelat nasledujici problem....

Mam nejaky clanek/text ve kterem mam precialni znacky, ktere maji nahradit urcity styl formatovani....
Formatovani se neda uskutecnit pres ccs styl ale dela to php kod.
Tak tedka jak to udelat, kdyz pouziji cyklus, tak to zvladnu, ale bude to trvat dlouho.
Kdyz pouziji regularni vyrazivo, tak nevim jak toho docili, jde mu rici ze na tuto cast clanku pouzit funkci: nl2br
a na urcitou cast volat nejaky php kod....

Nelze pouzit na celou stranku funkci: nl2br.

v urcite casti kodu se muze a nebusi vyskytovat, ta specialni znacka, a muze se vyskytovat nekolikrat....


//priklad
clanek, zde formatovat: nl2br
.
.
.
<:code lang="vhdl">
.
zde formatovat specialni php funkci
.
<:/code>
.
.
zase clanek, zde formatovat:nl2br
.
.
.
<:code lang="abel">
.
.
zde formatovat specialni php funkci
.
.
<:/code>
.
.
zase clanek, formatovat pomoci fce: nl2br
.
.
konec clanku
Mastodont
Profil
Musíš prostě tu speciální značku hledat jen uvnitř <:code lang="vhdl"> ... <:/code> To se dá regulárem hravě zvládnout (když ho umíš napsat :-)
daop
Profil *
oky, stim nemam problem, jde me jak mam udelat hledani <:code tak abych nepouzival cyklus, ale namam tuseni zda je to v silach regularniho vyrazu zda me po najiti <:code nejaky text <:/code> zavola nejakou php funkci pro dalsi obsluhu...
A v pripade najiti: "nejaky text <:code" , a "<:/code> nejaky text" zase zavolat na tuto cast textu funkci: nl2br
stim souvisi i problem jak ten text z toho vytahnout nejlepsi by bylo kdyby regularni vizar vlatil pozice od, do je to co splnuje zadana podminka (pripadne vratit pole, kde bude nekolik od, do, pro ten druhy pripad).
Cily docela slozite hledani.....
Mastodont
Profil
preg_ replace nahrazuje v celém řetězci, nemusíš používat žádný cyklus. Pokud chceš na nalezeném textu volat nějakou funkci, tak preg_replace_callback.
Joker
Profil
daop
Z mého šablonovacího systému:
preg_match_all("#regulární výraz#",$html,$matches);
foreach($matches[1] as $i=>$m){
...

$matches[0][?] je pole nalezených textů, $matches[1][?] pole částí odpovídajících prvnímu závorkovanému podvýrazu atd.
Já procházím $matches[1] (první závorkovaný podvýraz, což v tom systému je název příkazu), v jiném použití by to bylo asi $matches[0] nebo něco jiného.
Joker
Profil
Jinak v jednodušších případech by bylo asi lepší preg_replace, jak píše Mastodont. Ten můj kód by se hodil pro složitější případy (než prosté nahrazení), třeba já v tom cyklu mám 60 řádků kódu :-)
daop
Profil *
zdravim,
neco jsem asi vykoumal.....

$rvVyraz ='[[:print:]]+|:code[[:print:]]+:\/code|[[:print:]]+';
$sClanek = split($rvVyraz, $sBuffer);

ale faka to nejak divne sice to neco rezseka ale v poli jsou jen tabulatory a returny.

jako testovaci retezec pouzivam toto:

"dgdsgsdgsd\r\ngdgfdglkfldgkfd :):)\r\n\r\npokud\r\nkonec tetu\r\n[:code]tedka je code\r\n gdgfdglk fldgkfd\r\n\r\n pokud\r\n dgdsgsdgsd\r\n gdgfdglkfldgkfd\r\n\r\nkonec code\r\n[:/code]\r\nneni code, zaver clanku\r\ngfdgfdgf\r\ngfdg"

spravne bych mel dostat pole o trech indexach ale to se nestane vlati se me 15 indexu.... se samena \r\n


spatve by se melo vratiti pole:
index0: dgdsgsdgsd\r\ngdgfdglkfldgkfd :):)\r\n\r\npokud\r\nkonec tetu\r\n
index1: [:code]tedka je code\r\n gdgfdglk fldgkfd\r\n\r\n pokud\r\n dgdsgsdgsd\r\n gdgfdglkfldgkfd\r\n\r\nkonec code\r\n[:/code]
index2: \r\nneni code, zaver clanku\r\ngfdgfdgf\r\ngfdg
daop
Profil *
no, kdy jsem vyraz upravil na takto:
$rvVyraz ='[^a-zA-Z0-9\-_ [:cntrl:]]+|:code[^a-zA-Z0-9\-_ [:cntrl:]]+:\/code|[^a-zA-Z0-9\-_ [:cntrl:]]+';
$sClanek = split($rvVyraz, $sBuffer);

tak to faka lepe, evidentne nefunguje [[:print:]] ale i tak se to chova docela divne, tedka se testovaci retezec rozseka na 5 casti, jete je tam nejaky problem......

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0