Autor Zpráva
kdeby45
Profil *
Ahoj, napsal jsem regulární výraz kde chci zanechat znaky od a-z, A-Z, 0-9, mezeru a pomlčku, to funguje ale když přidám i další znaky ěščřžýáíéĚŠČŘŽÝÁÍÉ tak mi namísto určitých znaků vypíše otazník v kosočtverci �. Proč?
$text4 = preg_replace('/[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉ0-9 -]+/', '', $obsah);
původní: script>Lolz@ "pšíáýáš+-§ŠÍ¨ůú)!(((/script>
text4: scriptLolz pšíáýáš-ŠÍ��script


když přidám i úÚůŮ tak se mi to už nezobrazuje. Proč?
$text4 = preg_replace('/[^a-zA-ZěščřžýáíéůúĚŠČŘŽÝÁÍÉŮÚ0-9 -]+/', '', $obsah);
původní: script>Lolz@ "pšíáýáš+-§ŠÍ¨ůú)!(((/script>
$text4: scriptLolz pšíáýáš-ŠÍůúscript 

jde ten regexp napsat lépe?
lionel messi
Profil
kdeby45:

Predpokladám, že pracuješ v dvojbajtovom kódovaní (typický predstaviteľ UTF-8). Za koncový oddeľovač (čiže v tvojom prípade znak /) pridaj písmenko u (pozor na veľkosť, musí to byť malé u), tzv. modifikátor.

jde ten regexp napsat lépe?

Napríklad môžeš použiť aj modifikátor i. Ten spôsobí, že regulár nebude rozlišovať malé a veľké písmená. Čiže celý výraz bude vyzerať takto:

$text4 = preg_replace('/[^a-zěščřžýáíéůú0-9 -]+/iu', '', $obsah);

Ďalšou otázkou je, či chceš odchytávať naozaj iba vybrané znaky (a napr. ď alebo ó nie), alebo chceš zachytiť skutočne ľubovoľné písmeno. Ak platí druhá možnosť, môžeš výraz zostručniť pomocou sekvencie \w, ktorá zachytí ľubovoľný alfanumerický znak (hocijaké číslo alebo písmeno). Čiže dostaneme čosi takéto:

$text4 = preg_replace('/[^\w -]+/iu', '', $obsah);
kdeby45
Profil *
lionel messi:
$text4 = preg_replace('/[^\w -]+/iu', '', $obsah);
tohle zanechá i azbuku, tedy ten způsob s iu, ale neni mi jasný co znamená to u. A kde jsem v tom prvním případě udělal chybu že mi to vyppisovalo ten znak �? to u způsobí že tam nebude �. Co teda konkrétně dělá to u a proč to ten můj první příklad (text4 hned na začátku) neodfiltroval?
lionel messi
Profil
kdeby45:
neni mi jasný co znamená to u


Zjednodušene povedané, PHP (a reguláry takisto) pri práci s reťazcami štandardne vychádza z predpokladu 1 znak = 1 bajt, čo však v prípade UTF-8 neplatí. Keďže funkcia (trebárs preg_replace) dostane v podobe textu v UTF-8 neočakávaný vstup, kde sú niektoré znaky zapísané viacerými bajtmi, tak sa môže ľahko stať, že sa niektorý viacbajtový znak ocitne na hrane orezania – jeden bajt sa oreže (alebo nahradí), druhý nie. Vznikne nezmysel, ktorý napr. v prehliadači alebo databáze vidíme ako �.

Modifikátor u „povie“ funkcii, že vstup je v UTF-8 a tá sa potom správa zodpovedajúcim spôsobom. V odkaze na dokumentáciu z [#2] je to popísané.

lionel messi:
$text4 = preg_replace('/[^\w -]+/iu', '', $obsah);
tohle zanechá i azbuku

V tom prípade by mal platiť prvý príklad z [#2].
kdeby45
Profil *
díky


.. za pomoc i vysvětlení

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