[REGEX/PHP] slim URL's parsen

Pagina: 1
Acties:
  • 402 views

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi,

Ik ben voor een project een 'slimme' parser aan het maken die het invoeren van gegevens in een veld van een blog monkey-proof moet maken. Lang verhaal kort, in het veld bronvermelding moet het niet uitmaken of de auteur een van de volgende dingen typt:

- http://www.google.com
- via http://www.google.com
- via google.com
- ik heb de link gevonden op google.com en http://www.google.com/test/test.html

Kortom, een 'slimme' preg_match met een valide regex volgens mij.

Na wat googlen vond ik het volgende: (stukje van hoe ik het gebruik in een class)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
        $this->url_regex = '^';
        $this->url_regex .= '(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?';
        $this->url_regex .= '(?#Username:Password)(?:\w+:\w+@)?';
        $this->url_regex .= '(?#Subdomains)(?:(?:[-\w]+\.)+';
        $this->url_regex .= '(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))';
        $this->url_regex .= '(?#Port)(?::[\d]{1,5})?';
        $this->url_regex .= '(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?';
        $this->url_regex .= '(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*';
        $this->url_regex .= '(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?^';

              $string = "blabla http://www.google.com"
              if(preg_match($this->url->regex, $string, $match) {
                     echo $match[0]; // --> www.google.com
              }
?>


Wat is hier nu het probleem mee?

- hij matcht wel op http://www.google.nl, maar in de result van de match helaas geen 'http://'. Ondanks deze volgens mij optioneel en greedy staat (?)

De regex heb ik gevonden op: http://geekswithblogs.net...ive/2005/12/01/61722.aspx

Iemand een idee om dit werkend te krijgen?

Acties:
  • 0 Henk 'm!

Verwijderd

Sowieso is je regex niet case insensitive, lijkt me toch misschien wel handig. Volgens mij hoef je een dubbele punt niet te escapen (na http). Je regex werkt niet goed op bijvoorbeeld *.net adressen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hoe maak ik de regex case insensitive?

Edit: Ik heb de escape voor dubbele punt weggehaald... dat maakte inderdaad niet uit, alleen is ie nog steeds niet greedy voor het "Protocol" stuk van de regex

voor http://www.google.com vangt ie: www.google.com

[ Voor 74% gewijzigd door Verwijderd op 03-06-2009 12:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 02 juni 2009 @ 23:42:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
        $this->url_regex = '^';
        $this->url_regex .= '(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?';
        $this->url_regex .= '(?#Username:Password)(?:\w+:\w+@)?';
        $this->url_regex .= '(?#Subdomains)(?:(?:[-\w]+\.)+';
        $this->url_regex .= '(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))';
        $this->url_regex .= '(?#Port)(?::[\d]{1,5})?';
        $this->url_regex .= '(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?';
        $this->url_regex .= '(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*';
        $this->url_regex .= '(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?^';

              $string = "blabla http://www.google.com"
              if(preg_match($this->url->regex, $string, $match) {
                     echo $match[0]; // --> www.google.com
              }
?>
Sowieso snap ik dat protocol gedeelte niet helemaal goed, ik ken dat ~ teken eigenlijk niet in regex.

Dit zou volgens mij al beter moeten werken:
code:
1
(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/)?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
We doen hier niet aan support op code van derden. Als je code vindt op het web en die copy/paste en verwacht dat alles in 1 keer werkt zonder er zelf moeite in te steken dan heb je nog wel even te gaan ;)

We verwachten hier in de Devschuur wel dat je minimaal een idee hebt waar je mee bezig bent; copy/pasten van andermans code en dan verwachten dat wij het voor je fixen of uitleggen gaat hier dus niet gebeuren :Y)

Zoals je ook in onze Quickstart zult lezen verwachten we dus wel eigen inzet en dat zie ik in dit topic nergens terug.

[ Voor 18% gewijzigd door RobIII op 03-06-2009 20:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.