Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja usuwająca znaki niealfanumeryczne
Forum PHP.pl > Forum > Przedszkole
Mesajah
Witam,

Czy jest jakaś funkcja, która pozwala usuwać wszystkie znaki niealfanumeryczne ze stringa (w celu stworzenia przyjaznego linka) ?

Np chciałbym zamienić:
  1. $a='Adam Mickiewicz - Dziady (1820)!'^&*_';

na:
  1. $b='adam-mickiewicz-dziady-1820';


Jak najprościej osiągnąć taki efekt ?

darko
Spróbuj
  1. preg_replace("/[^a-zA-Z0-9\s]/", "", $string);
mesajah
Dzięki, część już jest ok, ale znalazłem jeszcze coś takiego:

  1. class hUrls
  2. {
  3. private $a = array( 'Ę', 'Ó', 'Ą', 'Ś', 'Ł', 'Ż', 'Ź', 'Ć', 'Ń', 'ę', 'ó', 'ą',
  4. 'ś', 'ł', 'ż', 'ź', 'ć', 'ń' );
  5. private $b = array( 'E', 'O', 'A', 'S', 'L', 'Z', 'Z', 'C', 'N', 'e', 'o', 'a',
  6. 's', 'l', 'z', 'z', 'c', 'n' );
  7.  
  8. public function Parse( $string )
  9. {
  10. $string = str_replace( $this -> a, $this -> b, $string );
  11. $string = preg_replace( '#[^a-z0-9]#is', ' ', $string );
  12. $string = trim( $string );
  13. $string = preg_replace( '#\s{2,}#', ' ', $string );
  14. $string = str_replace( ' ', '-', $string );
  15. return $string;
  16. }
  17. }


Gdy próbuję wywołać tą funkcję:
  1. $string="śćą#$$$ --śćóżź";
  2. echo Parse($string);


Dostaje info:
Call to undefined function Parse()

Dlaczego ?
d3ut3r
Skoro tworzysz klasę hUrls to wypadałoby stworzyć obiekt tej klasy. Ewentualnie możesz wywołać to tak:

  1. echo hUrls::Parse($string);


pod warunkiem, że w kodzie klasy zmienisz Parse na metodę statyczną (jak słusznie zauważył Darko niżej). W przypadku gdy nie zmieniasz kodu klasy użyj konstrukcji z postu niżej.
darko
~d3ut3r to nie jest metoda statyczna, więc należy utworzyć obiekt klasy hUrls:
  1. $t = new hUrls();
  2. echo $t->Parse('test1234');

thek
To ja podam Ci złożony gotowiec złożony z nieco przerobionych 2 funkcji biblioteki utf8 i helpera url kohany 2.x smile.gif
  1. function title($title, $separator = '-') {
  2. $separator = ($separator === '-') ? '-' : '_';
  3. // Replace all characters that are national accents
  4. $UTF8_ACCENTS = array( 'ŕ' => 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o', 'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k', 'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o', 'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'ő' => 'o', 'ṡ' => 's', 'ř' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c', 'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't', 'ū' => 'u', 'č' => 'c', 'ö' => 'o', 'č' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l', 'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z', 'ẃ' => 'w', 'ḃ' => 'b', 'ĺ' => 'a', 'ě' => 'i', 'ď' => 'i', 'ḋ' => 'd', 'ť' => 't', 'ŗ' => 'r', 'ä' => 'a', 'í' => 'i', 'ŕ' => 'r', 'ę' => 'e', 'ü' => 'u', 'ň' => 'o', 'ē' => 'e', 'ń' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j', '˙' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o', 'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ă' => 'a', 'ġ' => 'g', 'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ů' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a', 'ű' => 'u', 'ţ' => 'th', 'đ' => 'dh', 'ć' => 'ae', 'ľ' => 'u', 'ĕ' => 'e', 'Ŕ' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O', 'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K', 'Ĕ' => 'E', 'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O', 'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Ő' => 'O', 'Ṡ' => 'S', 'Ř' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C', 'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T', 'Ū' => 'U', 'Č' => 'C', 'Ö' => 'O', 'Č' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L', 'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z', 'Ẃ' => 'W', 'Ḃ' => 'B', 'Ĺ' => 'A', 'Ě' => 'I', 'Ď' => 'I', 'Ḋ' => 'D', 'Ť' => 'T', 'Ŗ' => 'R', 'Ä' => 'A', 'Í' => 'I', 'Ŕ' => 'R', 'Ę' => 'E', 'Ü' => 'U', 'Ň' => 'O', 'Ē' => 'E', 'Ń' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J', 'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O', 'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ă' => 'A', 'Ġ' => 'G', 'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ů' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A', 'Ű' => 'U', 'Ţ' => 'Th', 'Đ' => 'Dh', 'Ć' => 'Ae' );
  5. $title = str_replace( array_keys($UTF8_ACCENTS), array_values($UTF8_ACCENTS), $title );
  6.  
  7. // Remove all characters that are not the separator, a-z, 0-9, or whitespace
  8. $title = preg_replace('/[^'.$separator.'a-z0-9\s]+/', '', strtolower($title));
  9.  
  10. // Replace all separator characters and whitespace by a single separator
  11. $title = preg_replace('/['.$separator.'\s]+/', $separator, $title);
  12.  
  13. // Trim separators from the beginning and end
  14. return trim($title, $separator);
  15. }

Mesajah
Skrypt Theka będzie chyba dobry do utf8- (tego mi brakuje), ale nie zamienia ogonków.
Tak w ogóle jak on działa ?
Na co zamienia znaki w utf skoro nie widzę tam drugiej tablicy (tej na które znaki są zamieniane).

Ja zmodyfikowałem inny skrypt na swoje potrzeby i wyszło coś takiego:

  1. function plCharset($string) {
  2.  
  3. $string = str_replace(".", "-", $string);
  4. $string = str_replace("[", "-", $string);
  5. $string = str_replace("]", "-", $string);
  6. $string = str_replace("(", "-", $string);
  7. $string = str_replace(")", "-", $string);
  8. $string = str_replace("<", "-", $string);
  9. $string = str_replace(">", "-", $string);
  10. $string = str_replace("*", "-", $string);
  11.  
  12. $string = strtolower($string);
  13. $polskie = array(',', ' - ',' ','ę', 'Ę', 'ó', 'Ó', 'Ą', 'ą', 'Ś', 's', 'ł', 'Ł', 'ż', 'Ż', 'Ź', 'ź', 'ć', 'Ć', 'ń', 'Ń','-',"'","/","?", '"', ":", 'ś', '!','.', '&', '&amp;', '#', ';', '[',']','domena.pl', '(', ')', '`', '%', '”', '„', '…');
  14. $miedzyn = array('-','-','-','e', 'e', 'o', 'o', 'a', 'a', 's', 's', 'l', 'l', 'z', 'z', 'z', 'z', 'c', 'c', 'n', 'n','-',"","","","","",'s','','', '', '', '', '', '', '', '', '', '', '', '', '');
  15. $string = str_replace($polskie, $miedzyn, $string);
  16. $string = str_replace("_", "-", $string);
  17.  
  18.  
  19. // usuń wszytko co jest niedozwolonym znakiem
  20. $string = preg_replace('/[^0-9a-z\-]+/', '', $string);
  21.  
  22. // zredukuj liczbę myślników do jednego obok siebie
  23. $string = preg_replace('/[\-]+/', '-', $string);
  24.  
  25. // usuwamy możliwe myślniki na początku i końcu
  26. $string = trim($string, '-');
  27.  
  28. $string = stripslashes($string);
  29.  
  30. // na wszelki wypadek
  31. $string = urlencode($string);
  32.  
  33. return $string;
  34. }


Może się komuś przyda.

Fajnie zamienia praktycznie wszystko na takie linki o jakie chodzi, tylko dlaczego pewne znaki i tak muszę zastępować str_replace questionmark.gif
*._ ...to są jakieś specjalne znaki ?
Jak w takim razie działa to:
  1. $string = preg_replace('/[^0-9a-z\-]+/', '', $string);

Wykrzyknik usunie a nawiasów, gwiazdek, podkreślników nie ?
thek
Mesajah... Jak widzę nie przyjrzałeś się JAK działa ten kod. Podaje tablicę znaków innych niż a-z, a więc diakrytyki narodowe jako klucze tablicy, a wartości tablicy to znaki na jakie podczas konwersji się zamienia je w str_replace. Stąd nie mam dwóch tablic, a tylko jedną. W str_replace jako argumenty podaję raz array_keys, a raz array_values. Potem usuwam wszystkie inne jakie jeszcze zostały i na koniec wielokrotne wystąpienie separatora czy spacji zastępujemy pojedynczym separatorem. A dla pewności trimujemy string z możliwych separatorów na obu końcach stringa. Co do preg_replace i problemów z niektórymi znakami to może ich nie zaescape'owałeś? * czy . to znaki specjalne wyrażeń regularnych i muszą być poprzedzone znakiem ucieczki by traktował je dosłownie. Ja to "olewam" i usuwam je jako niealfanumeryczne w 8 linii wyrażeniem. A poza tym to chyba masz coś nie tak z parserem, bo podane przez Ciebie na końcu wyrażenie usuwa ze stringa * ( ) _ i inne znaki niealfanumeryczne. Weź zassij choćby regexp editor stąd i sam sprawdź smile.gif
http://www.waterproof.fr/products/RegExpEditor/
Mesajah
No rzeczywiście chyba się za dobrze nie przyjrzałem (późno było), ale teraz już wszystko kapuje.
Nie wiem co z moim parserem, ale musiałem dodać linijki str_replace, żeby mi usunął pewne znaki, bo inaczej
nie zamieniał ich.
Co do escapowania to nie robiłem tego, nawet nie wiem w którym momencie miałbym to robić, czy w tym kodzie który podałem,
czy w jego argumentach (a tego raczej już bym nie chciał zmieniać).

Spróbuje zastąpić moją regułę:
  1. $string = preg_replace('/[^0-9a-z\-]+/', '', $string);

Tą której Ty używasz:
  1. $title = preg_replace('/[^'.$separator.'a-z0-9\s]+/', '', strtolower($title));

Aczkolwiek dziwne, że ta moja nie usuwa tego co powinna, skoro mówisz, że u Ciebie nie ma z tym problemu...
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.