Autor Zpráva
Meldo
Profil
Mám nasledujúci regulérny výraz:

$retazec = '
lorem [URL:http://www.odkaz.cz/]Odkaz[/URL]ipsum dolor sit amet em peltos me tuion [URL:http://www.odkaz.sk/]Odkaz[/URL] lorem ipsum dolor.';
$vzor = '|\[URL:([^"]+)\](.*?)\[/URL\]|';
$nahradenie = '<a href="$1">$2</a>';
echo preg_replace($vzor, $nahradenie, $retazec);


Všetko funguje ako má až nato, že ak mám v texte viac ako jeden odkaz, oznaci to jeden a velku cast textu ignoruje. Proste ani nevypise. Ako to upraviť, aby to bralo koľko koľvek odkazov?
Retal
Profil
Ungreedy pro celý výraz:

$vzor = '|\[URL:([^"]+)\](.*)\[/URL\]|U';
Meldo
Profil
Retal
Jasne. To je presne ono.

Ešte sa chcem spýtať všeobecne k regulernym vyrazom. Keď porovnavam nejaky retazec so vzorom, može byť v tom vzore aj dlhy text( napr. 50 000 slov)? Neni to pomale? Alebo sa to robi inak?
Retal
Profil
Pokud víš, jak vypadá začátek a konec hledaného řetězce, vyhledal bych jej podle toho.
Meldo
Profil
Retal
Ano viem. Chcem to pouzivat pri wysivyg editore.
Retal
Profil
Nerozumím, k čemu to potřebuješ?
Meldo
Profil
Retal
No taky ten editor jak je tu ked pridavas komentar. Hrube pismo, odkaz apod. Asi sa to pise inak, ako som to ja napisal. :-))
Retal
Profil
Aha, ty nemyslíš, že těch 50 000 slov bude ve vzoru, ale ve zpracovávaném řetězci. No tak to je samozřejmě v pohodě.
Lolita
Profil
Zkusim se prizivit na tvym threadu, zkusil sem ukrast tvuj kod
mam text zhuba tohle [code]tancovala zizala[/code] na paloucku ... [code] ze ji hral dala[/code] kousek vdolku

kod mam tenhle (je ve forcyklu a normalni str_replace jde ....)

$vzor = '|\[code\](.*?)\[/code\]|U';
$nahradenie = '<pre>$1</pre>';
$rs[$i]["answer"] = preg_replace($vzor, $nahradenie, $rs[$i]["answer"]);


ale me to samozrejme nefunguje. Proste to uplne klidne vynecha prvni vyskyt atd.

Mimochodem nejaky detailni jednoduchy prehled co presne co u regexpu dela vcetne subvyrazu existuje? A pak nejaky dobry testovaci program na to, regulator moje lame vyrazy nebere (:

EDIT: tak koukam, ze zrovna na prikladu co sem dal to jde, ale v mi strance to realne nejde, super no \:
Nechapu co tomu vadi na \n v textu a jak to resit ):
Retal
Profil
Lolita
Předpokládám problém v tom, že tvůj reálný text obsahuje konce řádků. Přidej ke vzoru parametr "s".

$vzor = '|\[code\](.*?)\[/code\]|sU'; 


Používám referenční přehled na PHP
http://cz2.php.net/manual/en/reference.pcre.pattern.syntax.php
http://cz2.php.net/manual/en/reference.pcre.pattern.modifiers.php

Ale jestli hledáš návod, budeš se muset porozhlédnout jinde.
Lolita
Profil
Dik super, dokonce ty modifiers a syntax sou co sem hledal, na to cumim v manualu, ale nekliknu, celej ja no. Ale s takovouhle treba casem i pochopim preg_replace_callback (:
Meldo
Profil
Lolita
Ak mas taky jednoducu znacku [code], [b] a pod. je lepsie pouzit str_replace(). Pohladaj si v manuale. Je to omnoho jednoduchsie pouzit.
djlj
Profil
Meldo
Ale je to k ničemu. Když někdo ten tag jen otevře a už neuzavře, tak máš problém ;).
Meldo
Profil
djlj
tak ale to je len jeho chyba. Ked tu zadavam prispevok a zle uzavrem tak napr pri odkaze, odkaz sa zobrazi zle. A je to moja chyba.
krteczek
Profil
Meldo: no pokud budeš mit takto primiivně udělaný vzkaznik tak ti rozloží někdo stránku ani nebudeš vědět jak... a je to chyba programátora! nemužeš chtit aby lidi věděli že je třeba tagy uzavírat...
krteczek
zivan
Profil
No to asi zalezi na tom, co od nich jako autor chces. Pokud nekdo chce pouzivat tagy, tak at je taky umi uzavirat.
Meldo
Profil
krteczek
Mas pravdu. Ale ak uzivatel klikne na tlacidlo ktore mu hodi do okienka [pre][/pre] a on vymaze koncovy tag tak to neni moj problem. To je uzivatelova blbost.
krteczek
Profil
Meldojenže když někdo přijde na stránku a uvidí ji rozpadlou asi těško bude obvinovat uživatele ale webmastra... proto webmaster zodpovídá za stránku, platí pravidlo:
uživatel udělá chybu => webmastre uděll chybu (neudělal to blbuvzdorne)
.
Anonymní
Profil *
Me jde jeste o to, jak to v tom regexpu udelat na
[code](.*)[/code] v tom pripade pouzi deafaultni autoit jako $1 nebo
[code=(*.)](.*)[/code] v tom pripade pouzij $1 zadany a $2 zdany - mohl bych to resit jako [code(*.?)](.*)[/code] a pak bud jedna bude nebo ne a pak z ni replacnout = na nic, ale to me neprijde jako spravne reseni. Za rady predem dekuji.

Pouzivam preg replace callback s tim ze nemuze nastat pripada kdy bude v [code] jeste jeden [code] - tj. neco jako [code]dfa[code]asfsda[/code]afada[/code].
djlj
Profil
on vymaze koncovy tag tak to neni moj problem
Až se ti rozhodí layout, tak to bude tvůj problém ;).
Toto téma je uzamčeno. Odpověď nelze zaslat.

0