Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wyrażenie regularne, tyty.pl zmiana na http://tyty.pl
Maciek_#_&
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 1
Dołączył: 22.02.2010

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


Cześć ponownie (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/happy.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
wdev
post
Post #2





Grupa: Zarejestrowani
Postów: 86
Pomógł: 20
Dołączył: 20.01.2010

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


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:// (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/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ś (IMG:style_emoticons/default/winksmiley.jpg) No i oczywiście zachęcam do nauczenia się wyrażeń regularnych, bo to baaaaardzo przydatna rzecz (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Daimos
post
Post #3





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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;


Ten post edytował my salsa 27.10.2010, 18:59:27
Go to the top of the page
+Quote Post
wdev
post
Post #4





Grupa: Zarejestrowani
Postów: 86
Pomógł: 20
Dołączył: 20.01.2010

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


A już się chciałem obruszyć na my_salsę i proszę - doczytał mój i poprawił swój post (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.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: 25.08.2025 - 06:39