Autor Zpráva
fimmos
Profil
Dobrý den,
při psaní fce na formátování textu jsem narazil na tento problém. Při eregi_replace
$text = eregi_replace('\(b\)(.+)\(/b\)', '<b>\\1</b>', $text);
když zadám text (b)tučné(/b) něco dalšího a (b)opět tučné(/b) tak tučně se to vyznačí vše, i to mezitím, co nemá být tučné(/b) něco dalšího a (b)opět tučné

jak se to tedy vyřeší tak, aby byl tučný text jen mezi tím (b) a (/b)?


děkuji
Marty
Profil
No tak musíte ty b v závorkách (nebo klidně i je samé) změnit na něco jiného aby to ta fce znovu nevytučnila.
fimmos
Profil
nechápu...
potřebuji tučně něco pak normálně a pak něco tučně
jenže mi to vezmě první a poslední (b) a (/b) a udělá vše tučně
Cenobit
Profil
Hi

$text = eregi_replace('\(b\)([^/(b/)]+)\(/b\)', '<b>\\1</b>', $text);

nale nevim jak udelat aby to bralo v potaz cely vyraz (b) a ne jen jednotlive znaky. Zkus prostudovat php.net - myslim ,ze na tohle tam byl priklad.
ah01
Profil
Obecně se doporučuje používat Perlové reg. výrazy. Nedávno o nich vycházel hezký seriál na Intervalu. A proč nepoužívat lepší věc, když můžeme :-) (funkce pro Perl-Compatible regulární výrazy jsou v PHP od verze 4.2.0)

Váš dotaz mi připomněl věc, co se píše v 5. díle, že regulární výrazy jsou nenasytné, proto je tučné vše od (b) do (/b). To se dá zakázat modifikátorem "U".

 $text = preg_replace( '~\(b\)(.+)\(/b\)~U', '<b>\\1</b>', $text );


Pokud to 'U' na konci reg. výrazu smažete, bude pak tučné vše od (b) do (/b).

---
Mimochodem, místo <b> bych doporučoval spíše tag <strong>.
Oswald
Profil
Místo (.+), zkus dát (.+?) a mělo by to fungovat. Otazník za kvantifikátorem (doufám, že to platí i v POSIX) vynutí lenost/nasytnost, o které píše ah01.

Update: takže POSIX tohle podle všeho nezná
krteczek
Profil
pokud se skombinují oba vyrazy zde uvedené tak by to mělo fungovat v pořádku, a nebude výraz nenasytný:

(\(b\))([^(/b)].*)(\(/b\))

...aspoň myslím, když tak mužeš trenovat: http://www.regexp.cz/
krteczek
Oswald
Profil
Nejjednodušší stejně bude:

$text = str_replace(array('(b)', '(/b)'), array('<b>', '</b>'), $text);


Krtecek:
[^(/b)] - to matchuje jeden znak, který není žádným ze skupiny uvnitř závorek, což je asi něco jinýho, než jsi chtěl.
fimmos
Profil
Oswald:

jenže to vaše to jen nahradí, regulérní výrazy to nahradí jen když se tam najde ten vzorek. Proto když dám jen (b) a něco a neukončím to, tak to nahradí tím <b> a vše potom bude tučné.

ah01:

díky...
Toto téma je uzamčeno. Odpověď nelze zaslat.

0