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 &lt;b&gt;$i&lt;/b&gt;

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
vito scaletta:
zrejme máte problém s úvodzovkami:
$x="text";
echo "$x"; //vypíše text
echo '$x'; //vypíše $x
juriad
Profil
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 &lt;b&gt;$i&lt;/b&gt; (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>
Poznámka: ukládej do databáze celý pattern i s oddělovači, tedy: /\[b\](.*?)\[\/b\]/i. Někdy bys třeba mohl chtít rozlišovat velikost písmen.
Camo
Profil
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'];
Pozdě
vito scaletta
Profil
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
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);
(viz manuál: http://cz2.php.net/manual/en/regexp.reference.subpatterns.php)
vito scaletta
Profil
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);
Vypíše: 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
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
Smyčka vždy bude dělat bordel.
vito scaletta
Profil
díky už mi to funguje

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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