Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ModRewriteString, zamiana stringu na ModRewrite
Athlan
post
Post #1





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Denver
post
Post #2





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

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


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. ?>


Ten post edytował Denver 27.12.2006, 15:34:29
Go to the top of the page
+Quote Post
Athlan
post
Post #3





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Denver: słusznie, parę rzeczy poprawionych (IMG:http://forum.php.pl/style_emoticons/default/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. ?>


Ten post edytował Athlan 27.12.2006, 16:33:00
Go to the top of the page
+Quote Post
Denver
post
Post #4





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

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


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.
Go to the top of the page
+Quote Post
Athlan
post
Post #5





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
NuLL
post
Post #6





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Dosc komiczna klasa - osoba piszaca 'framework' nie ma pojecia o wyrazeniach regularnych....

Ten post edytował NuLL 27.12.2006, 18:09:44
Go to the top of the page
+Quote Post
hwao
post
Post #7


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Jak dla mnie trochę myląca nazwa komponentu, co to ma wspólnego z ModRewrite?
Go to the top of the page
+Quote Post
Athlan
post
Post #8





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Cytat
Dosc komiczna klasa - osoba piszaca 'framework' nie ma pojecia o wyrazeniach regularnych....

Faktycznie, nie pomyślałem (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
shpyo
post
Post #9





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

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


to przecież można zrobić kilkoma preg_replace (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 3.10.2025 - 03:06