Regex: Wie kann eine beliebige Zeichenfolge bis zum Leerzeichen oder bis zur Interpunktion gefolgt von Leerzeichen abgeglichen werden?

8

Ich versuche, einen regulären Ausdruck zu schreiben, der URLs in einer Klartextzeichenfolge findet, sodass ich sie mit Anchor-Tags umschließen kann. Ich weiß, dass Ausdrücke dafür bereits verfügbar sind , aber ich möchte meine eigenen erstellen, hauptsächlich weil ich wissen möchte, wie es geht funktioniert.

Da es nichts brechen wird, wenn meine Regex fehlschlägt, ist mein Plan, etwas ziemlich einfaches zu schreiben. Bis jetzt bedeutet das: 1) passe "www" oder "http" am Anfang eines Wortes an 2) pass auf, bis das Wort endet.

Ich kann das tun, AFAICT. Ich habe das: \b(http|www).?[^\s]+

Was bei foo www.example.com bar http://www.example.com etc funktioniert.

Das Problem ist, dass ich, wenn ich foo www.example.com, http://www.example.com gebe, denke, dass das Komma ein Teil der URL ist.

Wenn ich also einen Ausdruck dafür verwenden soll, muss ich "... und stoppe wenn du Whitespace siehst" zu "... und höre auf, wenn du Whitespace oder ein Interpunktionszeichen vor dem Whitespace siehst ". Dies ist, was ich nicht weiß, wie zu tun ist.

Im Moment denke ich an eine Lösung, mit der ich gerade laufe, indem ich einen weiteren Test hinzufüge - der URL entspricht und dann in der nächsten Zeile jede hinterhältige Interpunktion verschiebt. Das ist einfach nicht so elegant.

Hinweis: Ich schreibe dies in PHP.

Nebenbei: Warum scheint das Ersetzen von \s mit \b im obigen Ausdruck nicht zu funktionieren?

ETA:

Danke allen!

Dies ist, was ich schließlich auf Grundlage der Explosion Pills Ratschläge endete:

%Vor%

Ich habe einen Callback hinzugefügt, so dass alle Links mit http: // beginnen würden, und habe ein wenig mit der Art und Weise, wie die Interpunktion behandelt wird, gearbeitet.

Es ist wahrscheinlich nicht der beste Weg, Dinge zu tun, aber es funktioniert. Ich habe in letzter Zeit viel darüber gelernt, aber es gibt noch mehr zu lernen!

    
Nick Loewen 05.06.2013, 05:13
quelle

4 Antworten

9
%Vor%

... ist wahrscheinlich, was Sie anstreben. Ich denke, es ist immer noch unvollkommen, aber es sollte zumindest für Ihre Bedürfnisse funktionieren.

Nebenbei: Ich denke, das liegt daran, dass \b auch mit Interpunktion übereinstimmt

    
Explosion Pills 05.06.2013, 05:30
quelle
2

Dies erreichen Sie mit einer positiven Lookahead-Assertion :

%Vor%

Siehe hier auf Regexr .

Bedeutet, passen Sie alles an, aber whitespace ,.!? ODER stimmen Sie mit ,.!? überein, wenn nicht whitespace folgt.

Beiseite: Eine Wortgrenze ist kein Zeichen oder eine Menge von Zeichen, Sie können ' t lege es in eine Zeichenklasse. Es ist eine Assertion mit einer Breite von Null, die bei einer Änderung von einem Wortzeichen zu einem Nichtwortzeichen passt. Hier glaube ich, dass \b in einer Zeichenklasse als Backspace-Zeichen interpretiert wird (die String-Escape-Sequenz).

    
stema 05.06.2013 06:27
quelle
1

Das Problem kann in dem Punkt liegen, der in Regex-Sprache "irgendein Zeichen" bedeutet. Sie müssen wahrscheinlich entkommen:

%Vor%

Dann bedeutet das Fragezeichen 0 oder 1, also hast du "einen optionalen Punkt" gesagt, was nicht das ist, was du willst (richtig?):

%Vor%

Jetzt stimmt es nur mit http. und www. überein, also müssen Sie sagen, welche anderen Zeichen Sie akzeptieren wollen:

%Vor%

oder

%Vor%

Also sagen Sie jetzt,

  • an der Grenze eines Wortes
  • check für http oder www
  • setze einen Punkt
  • Erlaube einen Bereich a-z oder A-Z , erlaube kein Leerzeichen
  • eine oder mehrere dieser

Hinweis - Ich habe diese nicht getestet, aber sie sind hoffentlich korrekt - ish.

Beiseite (meine Meinung) - \s bedeutet "Leerzeichen". % Co_de% bedeutet "Wortgrenze". % Co_de% bedeutet "ein erlaubter Zeichenbereich". Das \b bedeutet "nicht". % Co_de% bedeutet "eins oder mehrere".

Also, wenn du [] sagst, sagst du: "erlaube keine Wortgrenzen in diesem Bereich von Zeichen, und es muss einen oder mehrere geben" und da ist nichts anderes da & gt; nichts anderes ist erlaubt & gt; es gibt nicht einen oder mehrere & gt; es bricht wahrscheinlich.

    
Ben 05.06.2013 05:27
quelle
0

Sie sollten etwas wie folgt versuchen:

%Vor%     
NeverHopeless 05.06.2013 05:45
quelle

Tags und Links