Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ModRewriteString
Forum PHP.pl > Inne > Oceny
Athlan
Kiedyś napisałem klasę ModRewriteString, którą opublikowałem na łamach forum.php.pl, która ma sprowadzić polskie, niemieckie i czeskie znaki do zwykłych liter, na przykład ą do a, ż i ź do z, itd.
Cytat
Żółw Który żyje -> zolw-ktory-zyje

Na potrzeby jednego z moich projektów (portalu) została ona użyta na kodowaniu UTF-8. Okazało się, że klasa akceptuje tylko kodowania WINDOWS-1250 i ISO 8859-2. Ze znaków zakodowanych przez UTF robił się znak nieodczytywalny, potocznie zwany "krzak". Problem został oznaczony jako bug najwyższego stopnia, klasa trafiła natychmiastowo do analizy. Z pomocą przyszła dokumentacja na temat Multibyte String Functions (rozdział LXXXV) dostępna w podstawowych rozdziałach oficjalnej dokumentacji języka php:
http://pl2.php.net/manual/pl/ref.mbstring.php
Ponadto cały dokument z klasą był zakodowany w formie ASCII, co jest niedorzeczne w tego typu działaniach. Plik zawierający klasę został ujęty w formie UTF-8 - uniwersalnego kodowania, które można bez problemu odkowodać.

Zmiany objęły tylko metodę Rewrite(), przyjmuje ona dodatkowy, nieobowiązkowy drugi parametr, który ustawia tryb pracy klasy na podane kodowanie. Gdy parametru nie podamy, lub otrzyma wartość null, wówczas kodowanie zostanie ustawione automatycznię poprzez analizę podanego ciągu znaków przez funkcję mb_detect_encoding(). Kodowanie jest o tyle ważnym elementem, gdyż zostaje podane wewnątrz klasy w funkcjach mb_strtolower() oraz mb_strlen(), odpowiedzialnych za poprawne wykonanie zadania metody.

Dodana została linijka odpowiedzialna za przerwania działania klasy juz na samym początku. Sprawdzane zostaje załadowane rozszerzenie "mbstring", odpowiedzalne za Multibyte String Functions. Gdy rozszerzenie nie zostanie załadowane, konstruktor wyrzuca wyjątek pierwotnej klasy Exception:

  1. <?php
  2. if(!extension_loaded("mbstring"))
  3.  throw new Exception('MbString has not been enabled yet!');
  4. ?>


Wersja klasy została oficjalnie uznana za stabilną, nadany jest jej numerek 0.0.3.

Zastosowanie klasy:

  1. <?php
  2. $oRewrite = new ModRewriteString();
  3.  $sParsed = $oRewrite->Rewrite('żółw, ktróy przez zboże się ślimaczy');
  4.  echo $sParsed;
  5. ?>


Pobierz ModRewriteString 0.0.3

Zapraszam do ocen klasy smile.gif
Denver
Parę uwag:

1. Z każdym wywołaniem metody Rewrite uruchamiasz prywatną metodę _ReplaceChars, w której deklarujesz nową tablicę ze znakami do zmiany. Wybrałeś mało wydajne rozwiązanie - lepiej tę tablicę zadeklarować w konstruktorze klasy, zamiast przy każdym wywołaniu _ReplaceChars.

2. W metodzie Rewrite przed pętlą for zainicjuj zmienną $sRewrited = '';

3. Moim zdaniem, klasa może być spokojnie używana z metodami statycznymi (czyli bez konieczności tworzenia obiektu klasy), gdyż w zasadzie nie operuje na żadnych wewnętrznych właściwościach. Tablicę ze znakami do zamiany możesz ustawić jako static, a same tłumaczenie stringa wyglądałoby:

  1. <?php
  2. $sParsed = ModRewriteString::Rewrite ('żółw, który przez zboże się ślimaczy');
  3. echo $sParsed;
  4. ?>
Athlan
Denver: słusznie, parę rzeczy poprawionych smile.gif

Pobierz ModRewriteString 0.0.4

--- EDIT ---

użycie:
  1. <?php
  2. echo ModRewriteString::Rewrite('żółw, ktróy przez zboże się ślimaczy');
  3. ?>
Denver
Fragment:
  1. <?php
  2. if(count(self::$_aChars) < 1)
  3. {
  4. $aCharsLetters = range('a','z');
  5. $aCharsNumbers = range('1','9');
  6. $aCharsSpecial = array('_','-','!');
  7.  
  8. self::$_aChars = array_merge($aCharsLetters, $aCharsNumbers, $aCharsSpecial);
  9. }
  10. ?>

też mógłby być w jakiś sposób cache'owany. Np. tak:
  1. <?php
  2. public static function Cache ()
  3. {
  4. if(count(self::$_aChars) < 1)
  5. {
  6. $aCharsLetters = range('a','z');
  7. $aCharsNumbers = range('1','9');
  8. $aCharsSpecial = array('_','-','!');
  9.  
  10. self::$_aChars = array_merge($aCharsLetters, $aCharsNumbers, $aCharsSpecial);
  11. }
  12. }
  13. ?>

a pod ciałem klasy ModRewriteString kod:
  1. <?php
  2. ModRewriteString::Cache();
  3. ?>

Zapewni Ci to wykonanie tego kodu tylko raz, w momencie dołączenia pliku z klasą do Twojego skryptu.
Athlan
Denver: szczeże to zbyt zabajerowane, jak na akcje, która wkłada kilkadziesiąt jednoznakowych elementów do tablicy, ale słuszna uwaga - dobry pomysł, zastosuje go w innych klasach smile.gif
NuLL
Dosc komiczna klasa - osoba piszaca 'framework' nie ma pojecia o wyrazeniach regularnych....
hwao
Jak dla mnie trochę myląca nazwa komponentu, co to ma wspólnego z ModRewrite?
Athlan
Cytat
Dosc komiczna klasa - osoba piszaca 'framework' nie ma pojecia o wyrazeniach regularnych....

Faktycznie, nie pomyślałem smile.gif Dlatego prezentuję następną wersję klasy, już bez zbierania jakichkolwiek znaków, wykonywania pętli. Wszystko zawarte jest w jednym RegExp. Zniknął problem z kwestią omawianą przez @SHiP'a.

Prezentuję wersję 0.0.5

Cytat
Jak dla mnie trochę myląca nazwa komponentu, co to ma wspólnego z ModRewrite?

Może dlatego, że zmienia mi zwykły tytuł newsa, bądż atrykuły na string używane w modrewrite? Moim zdaniem (przynajmniej dla mnie) nazwa trafna.
shpyo
to przecież można zrobić kilkoma preg_replace tongue.gif
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.