Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]usuwanie polskich znaków w stringu
Forum PHP.pl > Forum > Przedszkole
Gość
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?
wNogachSpisz
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ę.
Gość
tak chce wykryć, wybacz mi
-Boria-
Spróbuj funkcji stristr()

function validate_polish($input) {
if (!stristr($input, 'ź')) {
return false;
}
return true;
}
wNogachSpisz
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ć.
PanBorys
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 />';
}

}
?>
wNogachSpisz
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.
camikazee
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")
wNogachSpisz
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.
styryl
  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.  
camikazee
Działać, zadziała, kwestia zmiany kodowania.
wNogachSpisz
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. }
rocktech.pl
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);
wNogachSpisz
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.
rocktech.pl
@wNogachSpisz

Nie miałem nigdy problemów z iconv.
Może lepiej być nie może smile.gif
wNogachSpisz
Ja mam problem już na wejściu, wywala ERROR
Gość
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
wNogachSpisz
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.
thek
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.