Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenie regularne, tyty.pl zmiana na http://tyty.pl
Forum PHP.pl > Forum > Przedszkole
Maciek_#_&
Cześć ponownie smile.gif

Wyrażenia regularne to straszna rzecz, szczególnie jak się jej nie rozumie, dlatego liczę na pomoc,
preg_match ma zamieniać adres tak, żeby był w nim "http://" nawet jeśli potencjalny użytkownik wpisze adres.pl bez http.

Jak to miałby wyglądać ?

preg_match działa na zasadzie
  1. preg_match(wyrażenie1, wyrażenie1_zamień_na);

tak ?

Dziękuje za pomoc happy.gif
wdev
Witam,

Funkcja o którą pytasz, to właściwie nie jest preg_match, a substr_compare (musisz sprawdzić, czy początkowe znaki to http://), ale i tak wypadałoby sprawdzić, czy użytkownik podał poprawny adres URL.
Gdybyś dobrze poszukał na php.net (opis funkcji preg_match) znalazłbyś takie wyrażenie regularne dla URL-a (no dobra, usunąłem ftp:// i https:// winksmiley.jpg):
  1. $regex = "/^(http\:\/\/)?"; // SCHEME
  2. $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
  3. $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP
  4. $regex .= "(\:[0-9]{2,5})?"; // Port
  5. $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path
  6. $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query
  7. $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?/"; // Anchor

Pytanie, czy jest Ci ono potrzebne w tak rozbudowanej formie, ale na to sam sobie musisz odpowiedzieć winksmiley.jpg Jeśli jednak potrzebujesz, to możesz je też rozbudować o inne protokoły, np. zmieniając w 1. linijce http na (http|ftp|ssl) itp.
Po sprawdzeniu, czy URL jest poprawny, wystarczy mała funkcja:
  1. dodaj_http($string){
  2. if(isset($string) and substr_compare($string, 'http://', 0, 7) !== 0){
  3. return 'http://' . $string;
  4. }
  5. else{
  6. return $string;
  7. }
  8. }


A tak w ogóle to ja bym się zastanowił, czy nie warto zrobić tego w drugą stronę - obcinając wszędzie "http://" z przodu, żeby się później nie bawić z tymi ukośnikami np. przy zapisie do bazy danych, czy coś winksmiley.jpg No i oczywiście zachęcam do nauczenia się wyrażeń regularnych, bo to baaaaardzo przydatna rzecz smile.gif
Daimos
A jak chcesz proste rozwiązanie do podstawowych przypadków i bez walidacji to:
  1. $str2 = 'tete.pl';
  2. $str = 'http://'.preg_replace('/http:\/\/(.*)/i', '$1', $str2);
  3. echo $str;
wdev
A już się chciałem obruszyć na my_salsę i proszę - doczytał mój i poprawił swój post winksmiley.jpg

Jeśli chodzi o to sprawdzanie URL, to rzeczywiście zapomniałem, że są znaki narodowe itp. dopuszczone do użycia w adresach internetowych i nie sprawdziłem tego wyrażenia pod ich kątem, za co przepraszam. Maćku, z moim wyrażeniem Twoi użytkownicy nie będą mogli wpisać strony w stylu "ćąk.pl", chociaż zrobienie takiego adresu jest możliwe.

Szczerze mówiąc męczę się już z tym od paru godzin, ale nie umiem znaleźć innego sposobu, niż ręczne dołączenie tych znaków do zakresu. Spodziewałem się, że php zamieni [a-z] albo \w na pełny zestaw znaków, ale jednak nie. Może to kwestia jakichś ustawień locale? Chętnie bym zobaczył, co sądzą o tym bardziej doświadczeni koledzy smile.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.