Autor | Zpráva | ||
---|---|---|---|
vito scaletta Profil |
Dobrý den, při vytváření formátovacích značek pro web. Funguje v podstatě stejně jako na této diskusi (např. [ b]tučný text[ /b])
Ale když napíšu [ b]nějaký text[ /b] - rozbrazí se tučně $i a né - nějaký text Nevíte jak tuto chybu odstranit, děkuju za odpověď Dělám to pomocí regulárních výrazů: regulární výraz: \[b\]([^[]+?)\[\/b\] náhrada: <b>$i</b> - v databázi přepsáno proti ochraně do entit <b>$i</b> preg_replace($bbcode['tpl'], $bbcode['rep'], $data); $bbcode['tpl'] - regulární výraz $bbcode['rep'] = náhrada $data = text, který chceme formátovat |
||
Camo Profil |
#2 · Zasláno: 23. 8. 2013, 16:24:49
vito scaletta:
zrejme máte problém s úvodzovkami: $x="text"; echo "$x"; //vypíše text echo '$x'; //vypíše $x |
||
juriad Profil |
#3 · Zasláno: 23. 8. 2013, 16:31:43
Napřed to odlaď bez databáze.
Prostě: $tpl = '~\\[b\\](.*?)\\[\\/b\\]~'; $rep = '<b>$1</b>'; $data = 'netucne [b]tucne[/b] netucne'; echo preg_replace($tpl, $rep, $data); |
||
vito scaletta Profil |
Camo
Díky za odpověď, trochu to pomohlo, ale né úplně - promiň za dlouhý kod, ale jinak to nejde Vypíše warming a žádný text se nezobrazí Warning: preg_replace() [function.preg-replace]: Unknown modifier 'b' in C:\xampp\htdocs\16\frm_output_functions.inc.php on line 306 Mám první skript (frm_output_functions.inc.php) v něm funkci: function bbcode($db, $data) { $sql = 'SELECT template, replacement // v databázi jsou tyto hodnoty uloženy takto - template [ b]([^[]+?)[/ b]/; // replacement <b>$i</b> (dole ještě skript, který tyto hodnoty vkládá do MySQL FROM frm_bbcode'; $result = mysql_query($sql, $db) or die(mysql_error($db)); if (mysql_num_rows($result) > 0) { while($row = mysql_fetch_array($result)) { $bbcode['tpl'][] = '/'. html_entity_decode($row['template'], ENT_QUOTES). '/i'; $bbcode['rep'][] = html_entity_decode($row['replacement'], ENT_QUOTES); } $data1 = preg_replace($bbcode['tpl'], $bbcode['rep'], $data); $count = 1; while (($data1 != $data) and ($count < 4)) { $count++; $data = $data1; $data1 = preg_replace($bbcode['tpl'], $bbcode['rep'], $data); } } return $data; } a pak ve skriptu echo '</p><p>'. bbcode($db, nl2br(htmlspecialchars($body))) . '</p>'; Skript, který vkládá do databáze: case 'Přidat kód': $sql = 'INSERT INTO frm_bbcode (id, template, replacement) VALUES (NULL, "' . htmlentities($_POST['bbcode-tnew'], ENT_QUOTES) . '", "' . htmlentities($_POST['bbcode-rnew'],ENT_QUOTES) . '")'; mysql_query($sql, $db) or die(mysql_error($db)); header('Location: frm_admin.php?option=kody'); exit(); break; |
||
juriad Profil |
vito scaletta:
Žádné htmlentities do databáze nepatří! Použij mysql_real_escape_string. Pak se také zbavíš té blbosti html_entity_decode. (Žádný decode nebude třeba.) Jsou uložené chybě. Mají být uložené: template: \[b\](.*?)\[\/b\] replacement: <b>$1</b> /\[b\](.*?)\[\/b\]/i . Někdy bys třeba mohl chtít rozlišovat velikost písmen.
|
||
Camo Profil |
#6 · Zasláno: 23. 8. 2013, 17:00:54
vito scaletta:
Ja ti radím to celé lepšie vymyslieť. To s tými entitami tam naozaj nemá čo hľadať. No a tie paterny by som uchovával radšej v súbore. Podľa mňa sa to aj rýchlejšie načíta aj sa to lepšie spravuje. |
||
vito scaletta Profil |
juriad:
Udělal jsem to podle tvých rad dal jsem tam mysql_real_escape_string, v databázi je to uložený jak si mi říkal ale nyní mi to zase píše: Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\16\frm_output_functions.inc.php on line 304 tedy, Oddělovač nesmí být alfanumerická nebo zpětné lomítko řádek 304 - $data1 = preg_replace($bbcode['tpl'], $bbcode['rep'], $data); Camo, juriad: díky za pomoc vyřešeno regulární výraz má být: /\[b\](.*?)\[\/b\]/ - vyřeší ten warming |
||
juriad Profil |
Chyba bude v této části (snad jsem to opravil):
$bbcode['tpl'][] = '/'.$row['template']. '/i'; # nebo, pokud máš v databázi kódy i s oddělovači (ta lomítka /.../i): $bbcode['tpl'][] = $row['template']; $bbcode['rep'][] = $row['replacement']; |
||
vito scaletta Profil |
#9 · Zasláno: 23. 8. 2013, 18:01:38
Camo, juriad:
Když už jsme se bavili o formátovací kodu chtěl jsem se zeptat jak to funguje na diskusi, že se napřl [pre] přidá automaticky nebo tlačítka, která danému slovu [] přidají, když na ně kliknete a k tomu označíte daný text. |
||
juriad Profil |
vito scaletta:
Podívej se do zdrojáku djpw.cz/templates/djpw.js. Jedná se především o funkce insertTag a getTlacitka. |
||
vito scaletta Profil |
#11 · Zasláno: 24. 8. 2013, 12:50:12
Nechci zakládat nové téma, tak se zeptám tady.
Potřeboval bych regulární výraz, který rozpozná e-mail a následně jej převede na odkaz Mám regulární výraz pro rozpoznání e-mailu: [a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4} Ale nevím, jak by měla vypadat náhrada: <a href="mailto: ?nevimcosem">?nevimcosem</a> |
||
Tori Profil |
vito scaletta:
Nápověda: $text = '123, 456, 789'; echo preg_replace('~([0-9]+).+?([0-9]+).+?(?:[0-9]+)~', 'Tohle zachytila část reguláru v prvních závorkách: "$1", tohle ta v druhých závorkách: "$2". Třetí závorky začínají "?:", takže se nepočítají: "$3".', $text); |
||
vito scaletta Profil |
#13 · Zasláno: 25. 8. 2013, 08:48:31
Tori:
Podle tvé nápovědy jsem udělal takový regulární výraz: ~[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}~ funguje - problém je, že když dám jako náhradu $1 - tak se normálně vypíše adresa, např.jmeno@seznam.cz ale jakmile to vložím do <a href="mailto: $1"$1</a> - tak to začně dělat divy a je to úplně v.... Nevíš kde je chyba?, dík |
||
Camo Profil |
vito scaletta:
Dúfam, že to chýbajúce > je len preklep. |
||
vito scaletta Profil |
Camo:
jo je, abych to upřesnil, kam jsem se teď dostal: 1. formátovací kod - převede na odkaz(na e-mail) /\[url-e\](.*?)\[\/url-e\]/ -- <a href="mailto: $1">$1</a> 2. formátovací kod - převede e-mail na odkaz ~([a-zA-Z0-9._-]+@[a-zAZ0-9.-]+\.)[a-zA-Z._-]{2,4}~ -- [url-e]$1[/url-e] // asi jste si všimli, kam sahá závorka (označil jsem ji tučně) tím mi vznikne krásný odkaz - jmeno@email - (problém je s .cz (nebo com...) kdybych posunul závorku takto: ~([a-zA-Z0-9._-]+@[a-zAZ0-9.-]+\.[a-zA-Z._-]{2,4})~ už to nefunguje nevíte jak to udělat abych tam mohl přidat i .cz - ale pořád z toho vzniknul jeden odkaz- fungující děkuju |
||
juriad Profil |
mně funguje (na vyznačené místo si doplň pomlčku a zpětné lomítko):
$s = "neco jmeno@domena.cz neco dalsiho"; echo preg_replace('~([a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z._-]{2,4})~', "[url-e]$1[/url-e]", $s); neco [url-e]jmeno@domena.cz[/url-e] neco dalsiho
|
||
vito scaletta Profil |
juriad:
mam to přesně jako ty a vyhodí mi to toto: neco [url-e]jmeno@domena.cz[/url-e]">[url-e]jmeno@domena.cz[/url-e] neco dalsiho tučně označené jsou odkazy - oba mi otevřou e-mailový program - to by šlo. ale jako adresa příjemce - ten první neobsahuje nic a ten druhý adresa příjemce - [url-e]jmeno@domena.cz[/url-e] -když tam mam další formátovací kod na odkaz když to mam jako ty, tak mi to vypíše: [url-e][url-e][url-e]zabl.h@seznam.cz[/url-e][/url-e][/url-e] |
||
juriad Profil |
#18 · Zasláno: 25. 8. 2013, 11:18:29
Hádám, že to nejspíš koliduje s nějakými dalšími nahrazovacími pravidly. Nikde na vstupu ani v náhradě se nevyskytuje znak >. Ukaž trošku víc kódu (především část, která se odehrává po tomto nahrazení).
Zkus si ještě přidat výpis za každé nahrazení (poznáš tak, kde se něco pokazí): echo htmlspecialchars($retezec); |
||
vito scaletta Profil |
juriad:
tady je ta funkce: function bbcode($db, $data) { $sql = 'SELECT template, replacement FROM frm_bbcode'; $result = mysql_query($sql, $db) or die(mysql_error($db)); if (mysql_num_rows($result) > 0) { while($row = mysql_fetch_array($result)) { $bbcode['tpl'][] = $row['template']; $bbcode['rep'][] = $row['replacement']; } $data1 = preg_replace($bbcode['tpl'], $bbcode['rep'], $data); $count = 1; while ($data1 != $data /*and ($count < 4)*/) { $count++; $data = $data1; $data1 = preg_replace($bbcode['tpl'], $bbcode['rep'], $data); } } return $data; } template - obsahuje formátovací kod - např. /\[b\](.*?)\[\/b\]/ replacement - <b>$1</b> např. formátovací kod - /\[b\](.*?)\[\/b\]/ <b>$1</b> funguje úplně normálně nebo když dám nahradit email např. slovem ahoj - tak mi to vypíše normálně ahoj |
||
juriad Profil |
Problém ti vytváří ta smyčka (řádky 15--19).
Máš dvě možnosti: 1) nemít žádné náhrady, které by vyžadovali další zpracování; tedy při detekci emailové adresy rovnou vysázet příslušný <a href="mailto:$1">$1</a> místo současného [url-e]$1[/url-e]. V tomto případě můžeš provádět všechny náhrady zároveň. 2) zavést uspořádání na provádění náhrad; přidat do databáze další sloupec pořadí , podle kterého seřadíš prováděné náhrady. Napřiklad detekce emailové adresy bude mít 1, vysázení odkazu s mailtu podle bbkódu bude mít 2. V tomto případě musíš provádět jednotlivé náhrady postupně.
Ta smyčka provádí něco jako (záleží na pořadí pravidel): neco jmeno@domena.cz neco jineho a hele našel jsem emailovou adresu
neco [url-e]jmeno@domena.cz[/url-e] neco jineho a hele našel jsem emailovou adresu
neco [url-e][url-e]jmeno@domena.cz[/url-e][/url-e] neco jineho a hele našel jsem url-e
neco <a href="mailto:[url-e]jmeno@domena.cz">[url-e]jmeno@domena.cz</a>[/url-e] neco jineho a hele našel jsem emailovou adresu
neco <a href="mailto:[url-e][url-e]jmeno@domena.cz[/url-e]/">[url-e][url-e]jmeno@domena.cz[/url-e]</a>[/url-e] neco jineho |
||
vito scaletta Profil |
#21 · Zasláno: 25. 8. 2013, 12:45:01
díky už mi to funguje
|
||
Časová prodleva: 11 let
|
0