[PHP] wyrażenia regularne - banalny problem

Odpowiedz Nowy wątek
2006-12-30 12:20
Mizantrop
0

witam,
potrzebuje funkcje w php która wykona kilka operacji na łańcuchu znaków:
-zamiana wszystkiego na małe litery
-zamiana polskich znaków na znaki bez ogonków
-zamiana spacji na myślniki
-usunięcie z łańcucha innych znaków niż liczby i litery alfabetu (czyli wszystkie ? ! # $ % itp. wylatują)

łańcuch po ptrzerobieniu przez tą funkcę trafi do URLa, więc już wiecie jak to powinno chodzić,

kiepsko znam php, a wyrażenia regularne to już czrna magia dla mnie, wiec bedę bardzo wdzięczny za każdą pomoc!

Pozostało 580 znaków

2006-12-30 12:27
nav
0

strtolower
napisz sobie sam
str_replace
preg_replace('/\W/','','ciąg')

A do url nie lepiej zakodować te znaki przez (raw)urlencode ?


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

2006-12-30 12:43
0

-zamiana polskich znaków na znaki bez ogonków

$pl = array('ą','ć','ę'); 
$alpha = array('a','c','e');
$str = str_replace($pl,$alpha,$str);

<url>http://kooba.pl/</url>

Pozostało 580 znaków

2006-12-30 13:58
0

Z treści postu wynika, że Mizantrop chce generować przyjazne URLe bez znaków, które trzeba będzie zamieniać na procenty, tak jak to jest na przykład na polskim Joggerze (i angielskim chyba też), za wskazówką W3C dotyczącą wybierania adresów URI.

   $title = str_replace(
      array(
         'Ą', 'ą', 'Ę' // bla bla bla
      ),
      array(
         'a', 'a', 'e' // bla bla bla
      ),
      $title
   );
   // na małe litery
   $title = strtolower($title);
   // spacje na myślniki
   $title = str_replace(' ', '-', $title);
   // pozostałe brzydkie znaki usuwamy
   $title = preg_replace('#[^a-z0-9\-\._]#', '', $title);

Weź pod uwagę sytuację, gdyby na stronie, na której wykorzystujesz tę funkcję znalazłby się artykuł o tytule np. „$$$” (mało prawdopodobne) albo „Но погади!” (możliwe, jeśli stosujesz Unicode). Niby rzadko to się zdarza, ale lepiej się przygotować.

PS. A skoro to taki banalny problem, mogłeś go umieścić w dziale Newbie.


php if ($crazy) sqrt() or die;

Pozostało 580 znaków

2006-12-30 16:51
Mizantrop
0

nasmarowałem taką funkcję:

function oczysc_string($str)
{
    // na małe litery
    $str = strtolower($str);

    // zamiana polskich znaków na znaki bez ogonków
    $pl    = array('ą', 'ć', 'ę', 'ó', 'ł', 'ń', 'ź', 'ż', 'ś');
    $alpha = array('a', 'c', 'e', 'o', 'l', 'n', 'z', 'z', 's');
    $str = str_replace($pl, $alpha, $str);

    // spacje na myślniki
    $str = str_replace(' ', '-', $str);

    // pozostałe brzydkie znaki usuwamy
    $str = preg_replace('#[^a-z0-9\-\._]#', '', $str);

    return $str;
}

działa tak jak chciałem, dziękuję za pomoc

Pozostało 580 znaków

2006-12-30 18:25
Mizantrop
0

Jest jeden mały problem:

ta funkcja nie zamienia znaków: ą ś ź na ich bezogonkowe odpowiedniki.

póżniej jak po stringu przejedzie to:

$str = preg_replace('#[^a-z0-9\-]#', '', $str);

to te znaki wylatują. czy to jakiś błąd str_replace() czy ja gdzieś nawaliłem?

Pozostało 580 znaków

2006-12-30 19:43
nav
0

preg nie łapie polskich znaków. Musisz je wpisać do klasy znaków jeden po drugim.


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

2006-12-31 12:57
0

nav: czytanie jednak ze zrozumieniem :)

jeśli tylko ą, ś, ź to problem kodowania (w sumie jeśli wszystkie to też możliwe że problem kodowania ;P). Plik ze skryptem php po prostu ma być zapisany tym samym kodowaniem co dane które do niego dojdą, ew. zapisz te znaki w $pl we wszystkich kodowaniach które mogą dojść, a tablicę $alpha wydłuż odpowiednio powtarzając elementy
Skoro tylko ą, ś, ź to najprawdopodobniej skrypt masz napisany np w notatniku w Windows-1250 a strona jest - i tym samym dane dochodzą w ISO-8859-2 - albo na odwrót

btw w wyrażeniu nie musisz escape'ować kropki, jak przesuniesz myślnik na koniec nawiasu to jego też nie musisz
i nie wiem czy nie lepiej by było gdyby po nawiasie był jeszcze plusik


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0