mboost-dp1

RegEx


Gå til bund
Gravatar #1 - rackbox
12. jun. 2012 07:13
Jeg her følgende regex:

(https?://)?(www\.)?([a-zA-Z0-9_%\-+!\(\)]*)\b\.[a-z]{2,4}(\.[a-z]{2})?

Den skulle fange en base URL dog inkl. www og/eller http/s og fungerer fint..

Men når jeg smider den ind i preg_match() i PHP, så virker den ikke. Måske er problemet noget med at skulle escape backslash, eller andet? Jeg kan uanset hvad ikke få den til at virke.

Nogen, der lige har styr på det?
Gravatar #2 - Emil Melgaard
12. jun. 2012 07:20
Prøv:

preg_match('/(https?://)?(www\.)?([a-zA-Z0-9_%\-+!\(\)]*)
\b\.[a-z]{2,4}(\.[a-z]{2})?/', $subject)


Altså med single quotes om pattern. Så burde det ikke være nødvendigt at escape backslash.
Gravatar #3 - rackbox
12. jun. 2012 07:31
#2 så må der være noget andet galt... Den fanger ikke webadressen (jeg smider en $matches på som parameter og echoer den med $matches[0]... Den er helt tom med input www.multiform.dk

AltsÅ:


preg_match('/(https?://)?(www\.)?([a-zA-Z0-9_%\-+!\(\)]*)\b\.[a-z]{2,4}(\.[a-z]{2})?/', 'www.multiform.dk',$matches);
echo $matches[0];


Den virker i regExr
Gravatar #4 - kasperd
12. jun. 2012 07:39
rackbox (1) skrev:
J(https?://)?(www\.)?([a-zA-Z0-9_%\-+!\(\)]*)\b\.[a-z]{2,4}(\.[a-z]{2})?
Jeg kan få øje på flere problemer med det udtryk:
- Der kan være mange labels i et hostnavn. Du matcher ingen hostnavne med mere end fire labels, og kun hvis de har en meget specifik form.
- Du tillader karakterer i labels som reelt ikke er tilladt i hostnavne.
- Det er lidt uklart om dit \b virker efter hensigten.
- Top level domæner kan være meget længere end fire tegn.

Hvis man vil bruge en heuristik til at matche hostnavne er det nok bedst at bruge en fast liste af alle de gyldige top level domæner. Jeg tror det er sådan Gmail gør, og det virker nogenlunde fornuftigt.
Gravatar #5 - rackbox
12. jun. 2012 08:13
#4 fair nok - men jeg har egentlig ikke så meget behov for validering - det sker på et andet tidspunkt. Jeg skal bare have en match, der returnerer base URL med www og/eller http(s)

Hvordan ville PHP-koden se ud?
Gravatar #6 - Emil Melgaard
12. jun. 2012 08:38
Jeg har lige prøvet det selv, og grunden til at du får et tomt array er ikke fordi den ikke matcher, men fordi den kommer med en fejl:

preg_match(): Unknown modifier '/'


Prøv at escape de to "/":


preg_match('/(https?:\/\/)?(www\.)?([a-zA-Z0-9_%\-+!\(\)]*)\b\.[a-z]{2,4}(\.[a-z]{2})?/', 'www.multiform.dk',$matches);
echo $matches[0];
Gravatar #7 - rackbox
12. jun. 2012 08:58
#6 ser ud til at virke :)
Gravatar #8 - Ronson ⅍
12. jun. 2012 09:23
Det... var så lidt?
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login