Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]usuwanie polskich znaków w stringu
-Gość-
post 12.02.2012, 20:06:04
Post #1





Goście







kiedys widziałem taką fajną funkcję która usuwała polskie znaki, jakies cyruliki i takie tam. istnieje funkcja która mi zwróci true/false w zależności czy string składa się tylko z normalnych znaków i efentualnie cyfr?
Go to the top of the page
+Quote Post
wNogachSpisz
post 12.02.2012, 20:42:10
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


To w końcu co? W temacie piszesz że chcesz usunąć polskie znaki, natomiast w treści posta wykryć czy string je zawiera. Zdecyduj się.

Ten post edytował wNogachSpisz 12.02.2012, 20:43:03
Go to the top of the page
+Quote Post
-Gość-
post 12.02.2012, 21:36:16
Post #3





Goście







tak chce wykryć, wybacz mi
Go to the top of the page
+Quote Post
--Boria--
post 12.02.2012, 22:54:00
Post #4





Goście







Spróbuj funkcji stristr()

function validate_polish($input) {
if (!stristr($input, 'ź')) {
return false;
}
return true;
}
Go to the top of the page
+Quote Post
wNogachSpisz
post 12.02.2012, 23:11:30
Post #5





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Powiedz jeszcze czy wiadome jest jaki system kodowania został użyty.
Jeśli tak to rozwiązanie będzie proste, jeśli nie to trzeba będzie się nieco nagimnastykować.
Go to the top of the page
+Quote Post
PanBorys
post 12.02.2012, 23:24:06
Post #6





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 12.02.2012

Ostrzeżenie: (0%)
-----


a to co napisałem wcześniej nie zadziala?

Można włożyć w tablicę wszystkie polskie znaki w ten sposób:
<?php

$pl_ci='Ździebełkęą';
$arr = array('ą','ę','ż','ź','ć','ś','ł','ó','ń');

foreach($arr as $key => $szukaj_pl) {

if(stristr($pl_ci, $szukaj_pl) != FALSE) {
echo 'wyświetl jeśli znaleziono <br />';
}

}
?>
Go to the top of the page
+Quote Post
wNogachSpisz
post 12.02.2012, 23:45:27
Post #7





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Nie, nie zadziała - skuteczność będzie zależna od zbieżności kodowania danych wejściowych i pliku ze skryptem. Kardynalnym błędem jest umieszczanie w kodzie PHP znaków z poza tablicy ASCII.

Ten post edytował wNogachSpisz 13.02.2012, 01:08:57
Go to the top of the page
+Quote Post
camikazee
post 13.02.2012, 11:51:08
Post #8





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Wyrażeniami regularnymi możesz wykryć łatwo czy ciąg zawiera niedozwolone znaki, a nawet od razu je usunąć.
Taką funkcją np możesz szybko usunąć ogonki.
  1. strtr($sName, "ĄĆĘŁŃÓŚŻŹśąćęłńóśżź", "acelnoszzsacelnoszz")


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
wNogachSpisz
post 13.02.2012, 11:57:38
Post #9





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(camikazee @ 13.02.2012, 11:51:08 ) *
Wyrażeniami regularnymi możesz wykryć łatwo czy ciąg zawiera niedozwolone znaki, a nawet od razu je usunąć.
Taką funkcją np możesz szybko usunąć ogonki.
  1. strtr($sName, "ĄĆĘŁŃÓŚŻŹśąćęłńóśżź", "acelnoszzsacelnoszz")

Ten kod nie zadziała, patrz mój post wyżej.
Go to the top of the page
+Quote Post
styryl
post 13.02.2012, 12:00:26
Post #10





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

Ostrzeżenie: (0%)
-----


  1.  
  2. function rewrite($string){
  3. $a = array( 'Ę', 'Ó', 'Ą', 'Ś', 'Ł', 'Ż', 'Ź', 'Ć', 'Ń', 'ę', 'ó', 'ą',
  4. 'ś', 'ł', 'ż', 'ź', 'ć', 'ń' );
  5. $b = array( 'E', 'O', 'A', 'S', 'L', 'Z', 'Z', 'C', 'N', 'e', 'o', 'a',
  6. 's', 'l', 'z', 'z', 'c', 'n' );
  7.  
  8. $string = str_replace( $a, $b, $string );
  9. $string = preg_replace( '#[^a-z0-9]#is', ' ', $string );
  10. $string = trim( $string );
  11. $string = preg_replace( '#\s{2,}#', ' ', $string );
  12. $string = str_replace( ' ', '-', $string );
  13. $string = strtolower($string);
  14. return $string;
  15. }
  16.  
Go to the top of the page
+Quote Post
camikazee
post 13.02.2012, 12:01:10
Post #11





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Działać, zadziała, kwestia zmiany kodowania.


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
wNogachSpisz
post 13.02.2012, 12:07:03
Post #12





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Do dupy z takim programem który raz działa a raz nie.
Wyślesz to przez FTP w trybie ASCII i skrypt nie nadaje się do niczego.
Albo ktoś kiedyś postanowi zajrzeć do skryptu, zmieni jakiś szczegół np. usunie biały znak, potem zapisze nie zwracając uwagi na kodowanie i znowu całość idzie w kibel.

Tak się tego nie robi.

Teraz troszke offtopne, bo autor nie znajduej czasu żeby odpowiedzieć na moje pytanie.

Oto metoda jakiej używam do zamiany diakrytyków na łacińskie odpowiedniki, o ile wiem nie da się lepiej, input musi być w UTF-8.

  1. <?php
  2.  
  3. require 'I18N/UnicodeNormalizer.php';
  4. $normalizer = new I18N_UnicodeNormalizer(); // z PEAR
  5.  
  6. function diacritic_replace( $s ) {
  7.  
  8. global $normalizer;
  9.  
  10. // maps German (umlauts) and other European characters onto two characters before just removing diacritics
  11. $s = preg_replace( '@\x{00c4}@u' , "AE", $s ); // umlaut Ä => AE
  12. $s = preg_replace( '@\x{00d6}@u' , "OE", $s ); // umlaut Ö => OE
  13. $s = preg_replace( '@\x{00dc}@u' , "UE", $s ); // umlaut Ü => UE
  14. $s = preg_replace( '@\x{00e4}@u' , "ae", $s ); // umlaut ä => ae
  15. $s = preg_replace( '@\x{00f6}@u' , "oe", $s ); // umlaut ö => oe
  16. $s = preg_replace( '@\x{00fc}@u' , "ue", $s ); // umlaut ü => ue
  17. $s = preg_replace( '@\x{00f1}@u' , "ny", $s ); // ń => ny
  18. $s = preg_replace( '@\x{00ff}@u' , "yu", $s ); // ˙ => yu
  19.  
  20. // maps special characters (characters with diacritics) on their base-character followed by the diacritical mark
  21. // exmaple: Ú => U´, á => a`
  22.  
  23. $s = $normalizer->normalize($s, 'NFD', 'UTF-8');
  24.  
  25. $s = preg_replace( '@\pM@u' , "", $s ); // removes diacritics
  26.  
  27. $s = preg_replace( '@\x{00df}@u' , "ss", $s ); // maps German ß onto ss
  28. $s = preg_replace( '@\x{00c6}@u' , "AE", $s ); // Ć => AE
  29. $s = preg_replace( '@\x{00e6}@u' , "ae", $s ); // ć => ae
  30. $s = preg_replace( '@\x{0132}@u' , "IJ", $s ); // ? => IJ
  31. $s = preg_replace( '@\x{0133}@u' , "ij", $s ); // ? => ij
  32. $s = preg_replace( '@\x{0152}@u' , "OE", $s ); // Π=> OE
  33. $s = preg_replace( '@\x{0153}@u' , "oe", $s ); // œ => oe
  34.  
  35. $s = preg_replace( '@\x{00d0}@u' , "D", $s ); // Đ => D
  36. $s = preg_replace( '@\x{0110}@u' , "D", $s ); // Đ => D
  37. $s = preg_replace( '@\x{00f0}@u' , "d", $s ); // đ => d
  38. $s = preg_replace( '@\x{0111}@u' , "d", $s ); // d => d
  39. $s = preg_replace( '@\x{0126}@u' , "H", $s ); // H => H
  40. $s = preg_replace( '@\x{0127}@u' , "h", $s ); // h => h
  41. $s = preg_replace( '@\x{0131}@u' , "i", $s ); // i => i
  42. $s = preg_replace( '@\x{0138}@u' , "k", $s ); // ? => k
  43. $s = preg_replace( '@\x{013f}@u' , "L", $s ); // ? => L
  44. $s = preg_replace( '@\x{0141}@u' , "L", $s ); // L => L
  45. $s = preg_replace( '@\x{0140}@u' , "l", $s ); // ? => l
  46. $s = preg_replace( '@\x{0142}@u' , "l", $s ); // l => l
  47. $s = preg_replace( '@\x{014a}@u' , "N", $s ); // ? => N
  48. $s = preg_replace( '@\x{0149}@u' , "n", $s ); // ? => n
  49. $s = preg_replace( '@\x{014b}@u' , "n", $s ); // ? => n
  50. $s = preg_replace( '@\x{00d8}@u' , "O", $s ); // Ř => O
  51. $s = preg_replace( '@\x{00f8}@u' , "o", $s ); // ř => o
  52. $s = preg_replace( '@\x{017f}@u' , "s", $s ); // ? => s
  53. $s = preg_replace( '@\x{00de}@u' , "T", $s ); // Ţ => T
  54. $s = preg_replace( '@\x{0166}@u' , "T", $s ); // T => T
  55. $s = preg_replace( '@\x{00fe}@u' , "t", $s ); // ţ => t
  56. $s = preg_replace( '@\x{0167}@u' , "t", $s ); // t => t
  57.  
  58. // remove all non-ASCii characters
  59. $s = preg_replace( '@[^\0-\x80]@u' , "", $s );
  60.  
  61. return $s;
  62. }


Ten post edytował wNogachSpisz 13.02.2012, 12:20:40
Go to the top of the page
+Quote Post
rocktech.pl
post 13.02.2012, 12:21:43
Post #13





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


Witam.

Co do usuwania.

  1. $charset = "UTF-8";
  2.  
  3. $text = "Zażółć gęślą jaźń";
  4.  
  5. $text = iconv($charset, "ASCII//TRANSLIT//IGNORE", $text);


Co do wykrywania

  1. mb_detect_encoding($text, 'ASCII', true);


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
wNogachSpisz
post 13.02.2012, 12:23:31
Post #14





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Kod
Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed

iconv jest za słabo udokumentowany, szczególnie ten rugi parametr, czarna magia, z tego co pamiętam to jest to też zależne od set_locale. Także blisko ale nadal źle.

Natomiast to drugie jest chyba w porządku.

Ten post edytował wNogachSpisz 13.02.2012, 12:27:41
Go to the top of the page
+Quote Post
rocktech.pl
post 13.02.2012, 12:29:55
Post #15





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


@wNogachSpisz

Nie miałem nigdy problemów z iconv.
Może lepiej być nie może smile.gif


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
wNogachSpisz
post 13.02.2012, 12:34:27
Post #16





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Ja mam problem już na wejściu, wywala ERROR
Go to the top of the page
+Quote Post
-Gość-
post 13.02.2012, 17:07:41
Post #17





Goście







mb_detect_encoding się dobrze spisuje w przypadku nicku. ale przepuszcza znaki specjalne. więc istnieje funkcja gotowa, która mi zwaliduje imię? czyli z kolei przepuści polskie znaki ale nie przepuści innych znaków specjalnych
Go to the top of the page
+Quote Post
wNogachSpisz
post 13.02.2012, 17:20:39
Post #18





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Jeśli kodowanie jest jednobajtowe - bazujące na stornach kodowych - to bardzo łatwo sprawdzić numer konkretnego znaku w tablicy ASCII i tym samym rozpoznać czy jest to litera, cyfra, czy znak specjalny.
Jeśli natomiast kodowanie stosuje kilka bajtów na znak lub co gorsza mieszanej ilości bajtów na znak (jak UTF-8), to sprawa się komplikuje o tyle, że musisz ustalić czy dany bajt to tylko składowa znaku czy cały znak. Dlatego pytam czy dla programu znany jest system kodowania danych wejściowych, od tego zależy wybór optymalnego rozwiązania.
Go to the top of the page
+Quote Post
thek
post 14.02.2012, 08:35:53
Post #19





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Hmmm... A nie pomyślał nikt o zwykłym preg_match? Podajecie zakres znaków ozwolonych i tyle. Jeśli w stringu będzie cokolwiek spoza niego - zwróci Wam false.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 11:02