RegExp non valida

Non riesco a rendere opzionale http(s)?://, eppure dalla stringa lo è :wallbash:, me la passa solo se scrivo www...., se scrivo http://www... esce l'alert

([http(s)?://])?(www\.[A-Za-z0-9]+)...
inviato 10 anni fa
php
php
6
X 0 X

Ho provato così:

if(preg_match("/^(http(s)?:\/\/)?(www\.[A-Za-z0-9]+)/","miourl"))  echo "url valido";

e và. Ho semplicemente aggiunto i backslashes ai // e la ^ prima di (http.

risposto 10 anni fa
chumkiu
X 0 X

Ho provato così:

if(preg_match("/^(http(s)?:\/\/)?(www\.[A-Za-z0-9]+)/","miourl"))  echo "url valido";

e và. Ho semplicemente aggiunto i backslashes ai // e la ^ prima di (http.

Funziona, i blackslashes non li avevo messi perchè // essendo nelle parentesi quadre tutto ciò che è dentro viene letto in modo letterale, non capisco allora perchè con le parentesi tonde funziona e con quele quadre nò :-[

risposto 10 anni fa
php
php
6
X 0 X

penso che la chiave sia piuttosto il ^ all'inizio  :)

risposto 10 anni fa
chumkiu
X 0 X
penso che la chiave sia piuttosto il ^ all'inizio  :)

Ok, ho un'altra modifica che mi sono accorto ora

Ho questa parte iniziale obbliga l'inserimento di www. e opzionale http:// , se però scrivo http://pluto.com esce l'alert.

Che modifica faccio per consentire anche http:// (da solo senza www.) pur lasciandolo opzionale?

Cioè: deve accettare o uno o l'altro o assieme ma con l'obbligo di almeno uno, poi, che funzione ha quel ! davanti a preg_match ?

codice PHP:

if (!preg_match("/^(http://)?(www.[A-Za-z0-9]+)...
risposto 10 anni fa
php
php
6
X 0 X
Che modifica faccio per consentire anche http:// (da solo senza www.) pur lasciandolo opzionale?

Fai uno schemino... allora il problema è ovviamente http e www. Quali sono le combinazioni di questi due parametri che rendono l'url valido? vediamo:

(con 0/1 indico rispettivamente si/no)

[table]

[tr]

[td]http[/td][td]www[/td][td]valido[/td]

[/tr]

[tr]

[td]1[/td][td]1[/td][td]1[/td]

[/tr]

[tr]

[td]1[/td][td]0[/td][td]1[/td]

[/tr]

[tr]

[td]0[/td][td]1[/td][td]1[/td]

[/tr]

[tr]

[td]0[/td][td]0[/td][td]0[/td]

[/tr]

[/table]

Dalla tabella si capisce che ciò di cui hai bisogno è un OR che in regexp si fa con "|"

ergo:

preg_match("/^((http(s)?:\/\/)|(www\.))([A-Za-z0-9]+)/","miourl")

 :bye:

risposto 10 anni fa
chumkiu
X 0 X
Che modifica faccio per consentire anche http:// (da solo senza www.) pur lasciandolo opzionale?

Fai uno schemino... allora il problema è ovviamente http e www. Quali sono le combinazioni di questi due parametri che rendono l'url valido? vediamo:

(con 0/1 indico rispettivamente si/no)

[table]

[tr]

[td]http[/td][td]www[/td][td]valido[/td]

[/tr]

[tr]

[td]1[/td][td]1[/td][td]1[/td]

[/tr]

[tr]

[td]1[/td][td]0[/td][td]1[/td]

[/tr]

[tr]

[td]0[/td][td]1[/td][td]1[/td]

[/tr]

[tr]

[td]0[/td][td]0[/td][td]0[/td]

[/tr]

[/table]

Dalla tabella si capisce che ciò di cui hai bisogno è un OR che in regexp si fa con "|"

ergo:

preg_match("/^((http(s)?:\/\/)|(www\.))([A-Za-z0-9]+)/","miourl")

 :bye:

Funziona a metà :wallbash: dalle prove che ho fatto in js e php, passano o uno o l'altro ma non assieme, se scrivo http://www..... esce l'alert.

A che serve "!"?

risposto 10 anni fa
php
php
6
X 0 X

A me va... guarda che non è "!" ma "|" (pipe). è un OR.

http:// OR www. => valido

risposto 10 anni fa
chumkiu
X 0 X

A me va... guarda che non è "!" ma "|" (pipe). è un OR.

http:// OR www. => valido

Io intendo "!" quello in rosso

if (!preg_match("/^((http(s)?:\/\/)|(www\.))([A-Za-z0-9]+)(\.[=#$&A-Za-z0-9]+)?(\.[a-z]{2,4})(((\/[=#$&A-Za-z0-9]+)?((\/[=#$&A-Za-z0-9]+)(\.[a-z]{2,4})))?)$/",$url)){ 

Ho fatto delle prove ho notato che il problema stà nella parte opzionale (blu)

http://pippo.sito.dominio.org/home.php  funziona

www.pippo.sito.dominio.org/home.php   funziona

http://www.pippo.sito.dominio.org/home.php  NON FUNZIONA :lamo:

risposto 10 anni fa
php
php
6
modificato 10 anni fa
X 0 X

"!" nega il risultato.

!true= false

!false= true

quell'espressione regolare mi pare un pò eccessiva come rigoristà. Con questa non ho problemi:

$url="http://www.pippo.sito.dominio.org/home.php";
if(preg_match("/^((http(s)?:\/\/)|(www\.))([A-Za-z0-9]+)/",$url)) {
     echo "url valido";
}
else {
     echo "no";
}

Per il resto se non sapevi il signficato di ! è normale che non riuscivi a capire: fa esattamente il contrario di ciò che vuoi :)

risposto 10 anni fa
chumkiu
X 0 X

C'è qualcosa che non ho afferrato riguardo a "!"

Allora come mai la regExp dell'email funziona perfettamente visto che "la nega"? Spiegami :wallbash:

Ti posto i 2 codici

//Valida l'Email

//valida pippo@email.{2,4}//pip.po@email.{2,4}//pip_po@email.{2,4}//pip-po@email.{2,4}

if($email){

if(!ereg("^([#$&a-z0-9]+)(\.[#$&a-z0-9]+)?(-[#$&a-z0-9]+)?(_[#$&a-z0-9]+)?[@][a-z]+(\.[a-z]{2,4})$",$email)){

echo "Inserire un' Email valida";

 }

}

//Valida url (Campo non obbligatorio)

//valida https://www.pippo.dominio.{2,4}/forum/home.{2,4}

if ($url){

if (!preg_match("/^((http(s)?:\/\/)|(www\.))([A-Za-z0-9]+)(\.[A-Za-z0-9]+)?(\.[a-z]{2,4})(((\/[A-Za-z0-9]+)?((\/[A-Za-z0-9]+)(\.[a-z]{2,4})))?)$/",$url)){ 

echo "Inserire un' URL valido";

 }

}

risposto 10 anni fa
php
php
6
X 0 X

perché in questo caso accedi all'if solo se è sbagliato.

if(!(è un url valido?)) { echo "Inserire url valido perché questo non lo è"; }

il preg_match ritorna true se le corrispondenze sono rispettate.

risposto 10 anni fa
chumkiu
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda