Autor | Zpráva | ||
---|---|---|---|
kdeby45 Profil * |
#1 · Zasláno: 28. 11. 2019, 20:52:58
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 * |
#3 · Zasláno: 28. 11. 2019, 22:11:43
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í |
||
Časová prodleva: 5 let
|
0