Autor Zpráva
DarkMeni
Profil
Zdravím, nemůžu přijít na to jak vymazat všechny html značky uvnitř úvozovek, aby tam nebyly vůbec.
ZKoušel jsem toto:
$string = preg_replace("/\"<.*?>\"/is","",$string);

Ale nepomohlo to.
Jak se můžu zbavit jen html značek ale text tam nechat?
Například z tohoto:
"Text... <html-značka hromada=atributu>Text2...</html-značka> Text3..."
Udělat toto:
"Text... Text2... Text3..."
(Koukám že tady na fóru v ukázce kódu to nějak de, to co by se normálně mimo úvozovky vybarvilo je v úvozovkách v klidu)
__construct
Profil
DarkMeni:
A skúšal si strip_tags?
DarkMeni
Profil
Buď tu funkci špatně chápu nebo je v mém případě k ničemu, zkusim dát trochu lepší příklad:
Text... <html-značka>Text...</html-značka>"Text1... <html-značka hromada=atributu>Text2...</html-značka> Text3..." <html-značka>Text...</html-značka>
Přepsat na:
Text... <html-značka>Text...</html-značka>"Text1... Text2... Text3..." <html-značka>Text...</html-značka>
Takže mimo úvozovky můžou být, ale v úvozovkách ne.
Možná by se to dalo řešit rosekáním do pole (explode) po úvozovkách, ale jak pak poznám co bylo, a co ne v úvozovkách, i když, šlo by to ale dost složitě (až pak by sem použíl strip_tags).
Snad existuje jednodušší způsob.
__construct
Profil
DarkMeni:
Tak použi preg_replace a ako replacement hoď strip_tags.
DarkMeni
Profil
Toto:
$string = preg_replace("/[^<]\"(.*?)\"[^>]/is","<span style=\"color: gray;\">\"".strip_tags("$1")."\"</span>",$string);
?
Nejspíš mam špatně výraz (chtěl jsem aby to odstranilo html tagy z úvozovek, které nejsou součástí html tagu, a nějak to nefunguje), ale i kdyby to fungovalo tak výsledek bude stejný protože strip_tags dostane "$1" a to taky vrátí.
Jestli jsi to myslel jinak, tak jak?
Tori
Profil
DarkMeni:
[#5] myslím nefunguje proto, že nedřív se druhý parametr vyhodnotí (=odstraní tagy z řetězce „$1“) a až pak se provádí nahrazování. To co chcete by se dalo provést s preg_replace_callback - koukněte hned na první příklad. Edit: blbost. Regulár bude hledat jen "cokoli mezi uvozovkami".
__construct
Profil
DarkMeni:
Myslel som to takto nejako:
preg_replace('/"(.+?)"/e', "strip_tags('\\1')", $string);
DarkMeni
Profil
Ano to je ono, děkuji.
DarkMeni
Profil
Mám ještě jeden problém, tentokrát už snad čistě jen s výrazem, jde o to že zvýrazňuju některé html značky a když dojde na atributy, tak už tam nějaké budou, třeba class, kvůli zvýraznění html značek, a potom to vypadá nějak takto:
<span class="highlight-html">&lt;input type=<span class="highlight-quote">&quote;text&quote;</span> ... &gt;</span>

Takže vybarvit potřebuju jen to co je mezi &lt; a &gt; ale není mezi < a >. Nějak jsem to zkoušel ale dopadlo to špatně. (Buď to s sebou vybarvilo i ty které jsou mezi < nebo > a nebo to nevybarvilo vůbec nic, tento kód nevybarví vůbec nic:
//$code je definován
$attributes = "width|height|style|title|alt|src|border|colspan|rowspan|rules|class|id|name|href|content|http-equiv|type|";
$attributes.= "onclick|onmouseup|onmousedown|onmouseover|onmouseout|onmousemove|onpsesskey|onkeyup|onkeydown|onload|onchange";
$code = preg_replace("/((&lt;[^<>].*?)(".$attributes.".*?=?)*(.*?[^<>]&gt;))/i","$2<span class=\"highlight-html-attribute\">$3</span>$4",$code);

Čekal jsem že to udělá něco jako: Najde atributy které jsou mezi &lt; a &gt; ale zároveň nejsou v < nebo >.
S výrazy si ještě moc nerozumim, takže kdyby se našel někdo chytrý a nějak mi poradil tak mu budu vděčný.
Tori
Profil
DarkMeni:
A nebyl by jednodušší takovýto postup?
1. Nahradit < a > entitami (nebo jinou sekvencí znaků),
2. vyhledat a zvýraznit všechny atributy s hodnotami, ("~(\w+)=(('[^']+')|(\"[^\"]+\")|([\s+]))\s?~i" + callback)
3. vyhledat a zvýr. původní tagy (najdou se podle entit)
DarkMeni
Profil
Tak ve výrazech se ještě asi moc nevyznám (callback?) Ale ta 1. s nějakou sekvencí znaků, to je dobrej nápad, díky!
Tori
Profil
DarkMeni:
callback = odkaz na funkci, kterou má preg_replace volat pokaždé, když najde odpovídající kus textu. Předá jí ten atribut s hodnotou, funkce doplní zvýraznění a vrátí nový kus textu, kterým se nahradí ten původní. Dá se použít preg_replace + modifikátor e v reguláru, nebo preg_replace_callback.
Pokud nechcete dělat odlišné zvýrazňování pro různé skupiny atributů (JS události, ostatní HTML, specifika šablon.systému apod.), tak stačí první varianta.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0