Autor Zpráva
radvis
Profil
Ahoj, potřeboval bych oradit, chtěl bych prostě pomocí reg. výrazů upravit kód tj, budu mít třeba "[ b ]""[ /b ]" a to mi udělá <b></b> popřípadě třeby kdybych dal [p][/p] a ono by mi to udělalo <p class="test"></p>. Reg výrazy mi nejdou tak bych poprosil i o vysvětlení, díky!
Keeehi
Profil
funkce pro převod bbcodu na html
function BBcode($texto){
  $g = array(
    "/\[i\](.*?)\[\/i\]/is",
    "/\[b\](.*?)\[\/b\]/is",
    "/\[u\](.*?)\[\/u\]/is",
    "/\[img\](.*?)\[\/img\]/is",
    "/\[url=(http:\/\/){0,1}(.*?)\](.*?)\[\/url\]/is",
  );
  $h = array(
    "<i>$1</i>",
    "<b>$1</b>",
    "<u>$1</u>",
    "<img src=\"$1\" />",
    "<a href=\"http://$2\" target=\"_blank\">$3</a>",
  );

  $texto = preg_replace($g, $h, $texto);
  return $texto;
}
radvis
Profil
Viděl jsem i jednodužší příklad togo pole g nešlo by to zjednodužšit nějak takhle jsem to viděla "\[(/?(b|u|i|pre))\]". Btw, možná jsem natvrdlý, ale co je $1 kde se definuje nebo kde se bere? Nemá tam být $texto?
Chamurappi
Profil
Reaguji na radvise:
nešlo by to zjednodužšit nějak takhle
Šlo by to zjednodušit, ale ten nástin, který ukazuješ, by nezaručoval párovost BB-značek.

ale co je $1 kde se definuje
První uzávorkovaná skupina.

Nemá tam být $texto?
Není to proměnná, je to takový … charakteristický rys regulárních výrazů. Očíslované skupiny s dolarem se užívají i v regulárních výrazech JavaScriptu a v C#, kde se proměnné dolarem neuvozují.
radvis
Profil
Aha, tak moc díky oboum.
radvis
Profil
Ještě bych poprosil, jak by jste řešili kontrolu, zda jsou ukončené html tagy popřípadě je ukončily nebo je jen vypsali. Aby se třeba nestalo, že napíšu </div> a ona se mi rozhodí celá stránka.
AM_
Profil
výše uvedené výrazy nahrazují jedině páry tagů, takže to zcela určitě nepárové tagy nevytvoří.
radvis
Profil
To je jasný, ale co když se někdo přepíše a dá třeba <div> nebo </div>?
Keeehi
Profil
To je složitější proces:
Projdeš text od začátku do konce a třeba do pole.
Když narazíš na nepárový tag, vykašleš se na něj. Když narazíš na tag, který by měl být párový, uložíš ho do pole. Po několika nálezech to bude vypadat třeba takto: array ([0]=>"<div>", [1]="<p>", [2]="<b>"). Teď narazíš na ukončovací část. Když to bude </b>, normálně z toho pole vyjmeš <b> a pokračuješ, kdyby to byla ale třeba </div>, tak před něj vložíš </b></p> pak bude následovat ten nalezený </div> a za něj přidáš <p><b>. ten <div> vyjmeš z pole a posuneš klíče, takže pak to bude vypadat takto: array ([0]="<p>", [1]="<b>") a pak pokračuješ dál. Pokud by jsi náhodou narazil na ukončovací tag, který v poli nemáš, tak a) buď přidáš úplně na začátek jeho otevření a pokračuješ, nebo b) ho smažeš a pokračuješ.

Naprogramovat si to budeš už muset sám.
radvis
Profil
To moc nevím jak na to, nenašel bych podobný script na netu? jestli ano, pod čím hledat? A když narazím na tag, co je párový a není třeba ukončený nešlo by vypsat třeba jen </div> jakoby to byl normalni text?
Keeehi
Profil
radvis:
Když nevíš, tak bohužel.

Můžeš se nechat inspirovat tímto. Je to úplně o něčem jiném, ale inspirovat se tím dá. Tobě bych ale si spíš doporučil Práce a zakázky.

A když narazím na tag, co je párový a není třeba ukončený nešlo by vypsat třeba jen </div> jakoby to byl normalni text?
Zapomněl jsem napsat, když dorazíš nakonec, doplníš tam všechny zatím neuzavřené tagy které jsou v tom poli.
AM_
Profil
radvis:
A když narazím na tag, co je párový a není třeba ukončený nešlo by vypsat třeba jen </div> jakoby to byl normalni text?
obecně se to dělá tak, že se celý text prožene htmlspecialchars() a vybrané tagy se pak převedou z hranatých závorek (bbcode) funkcí uvedenou zde dříve.
radvis
Profil
AM_ -> jestli to dobře chápu, tak by mi to pak uložilo třeba <i></i> jako text a neprovedlo by se formátování na kurzivou, ne?
radvis
Profil
Ještě bych poprosil, jak bych zjístil, zda je v textu třeba slovo "ahoj" zkoušel jsem to podle výše uvedeného kódu, ale špatně, nejde mi to.

$test = preg_replace('\s(try)|(catch)\s', $text);
if($test){
    echo "<p>je tam!</p>";
}else{
    echo "<p>není tam! nebo ti to nejde!:D</p>";
}
radvis
Profil
V příkladu jsem hledal slovo try nebo catch. To jsem našel na netu (\s(try)|(catch)\s), ale nevím moc jak to použít.

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:

0