Autor Zpráva
halogan
Profil
Dobrý den,
do dneška jsem s regulárními výrazi neměl problém, ale dnes jsem se snažil udělat si takový minimální text2html converter, ale nejde mi tam jeden ereg_replace:


// začátek třídy (...)
$this->tags = Array("\*\*" => "strong", // tagy na převod
"\*" => "em",
"\-" => "del");
$this->paragraphs = mb_split("[\r\n]+", $this->input); // rozdělím podle nových řádků
$this->parse_p(); // parsuji jednotlivé odstavce
}

function parse_p()
{
foreach ($this->paragraphs as $value) {
// zpracovávám jeden odstavec
// zpracovávání (...)
$this->tags = array_flip($this->tags); // prohodíme klíče a hodnoty
$tg = "(" . implode("|", $this->tags) . ")"; // implodneme znaky - dostanu (\*\*|\*|\-)
$this->tags = array_flip($this->tags); // a vrátíme zpět
$i = 0;
while(eregi("$tg([^\*\-]+)$tg", $value) && $i<100) { // jde mi o to, že cyklem procházím text zevnitř, aby vše bylo validní, ale zasekl jsem se u následujícího replace:
$value = mb_ereg_replace("$tg([^\*\-]+)$tg", "NEVÍM", $value); // najde to jeden začátečný tag, jakýkoliv text bez tagů a pak koncový tag. Nevím, čím to nahradit, aby to fungovalo (pokračování dole)
$i++;
}
$this->output .= "<p>" . $value . "</p>\n\n";
}
}


...protože pokud doplním cokoli, tak to nejde. Potřeboval bych prostě <$this->tags[\\1]>\\2</$this->tags[\\1]>, ale nijak se mi to tam nedaří napasovat. Další problém je, že \* z proměnné vystupuje jako holé *, takže takto: <$this->tags[\\\\1]>\\2</$this->tags[\\\\1]>

Tam je ten problém, že když to zpracovává, tak to vypíše $this->tags (Array) a pak [\*]. Další potíž je ta, že např. u \*\* toto \\\\1 nelze použít :(

Sečteno a podtrženo potřebuji vypsat to \\1 dříve než ten prvek pole.
Nechci prosím odpovědi typu: Proveď to cyklem - to je až záchranná metoda.

Díky moc za nápady...
Kajman
Profil *
Nejjednoduší mi příjde si nachystat pole regulárních výrazů pro to replace.
Asi nějak $rep[('('.$key.')([^\*\-]+)\1')]='<'.$val.'>\2</'.$val.'>';

No každopádně si raději vše se zpětnými lomítky piš do jednoduchých uvozovek.
halogan
Profil
Samozřejmě bych radši vyřešení problému, ale tohle taky ujde, díky:

$value = mb_ereg_replace("\*\*([^\*\-]+)\*\*", "<strong>\\1</strong>", $value);
$value = mb_ereg_replace("\*([^\*\-]+)\*", "<em>\\1</em>", $value);
$value = mb_ereg_replace("\-([^\*\-]+)\-", "<del>\\1</del>", $value);
halogan
Profil
Ještě mám jeden menší problém:
na řádku:
while(eregi("$tg([^\*\-]+)$tg", $value)) {
se mi to cyklí, protože jsem neobstaral, aby $tg bylo na obou stranách stejné. Jde to nějak jednoduše udělat? \\1 nefunguje :/
Kajman
Profil *
\1 bude fungovat, jen je třeba si ten výraz ozávorkovat, jinak se na něj nedá odkazovat.

while(eregi('('.$tg.')([^\*\-]+)\1', $value))
Kajman
Profil *
Aha, ona tam závorka vlastně byla. Problém je v tom, že výraz je ve dvojitých uvozovkách a tam se zpětné lomítko píše jako dvě zpětná lomítka. Lepší je to dávat do jednoduchých uvozovek (možná se tomu správě říká apostrofy) - tam člověk neudělá tolik chyb.
halogan
Profil
Díky moc, moc jsi mi pomohl, nakonec jsem to vyřešil takto (cyklem)

while(mb_eregi('(' . $tg . ')[^\*\-]+\1', $value)) {
foreach ($this->tags as $sym => $tag) {
$value = mb_ereg_replace('(' . $sym . ')([^\*\-]+)\1', '<'.$tag.'>\2</'.$tag.'>', $value);
}
}
Toto téma je uzamčeno. Odpověď nelze zaslat.

0