2009-05-14 21 views
2

Ich habe die folgende Regex, die nicht funktioniert. Ich möchte die Zeichenfolge übereinstimmen ‚www.example.com‘, aber nicht die Zeichenfolge ‚http://www.example.com‘ (oder ‚anythingwww.example.com‘ für diese Angelegenheit):Regex, um www.example.com nur zu entsprechen, wenn http: // nicht vorhanden

/\bwww\.\w.\w/ig 

Diese in JavaScript wie folgt verwendet:

Ich weiß, dass der zweite Teil der Regex auch nicht richtig funktioniert, aber es ist der http: // Teil, der mich verwirrt. Es wird zur Zeit 'http://www.example.com' angezeigt, was zu einer Ausgabe von 'http://htpp://www.example.com' führt.

Antwort

2

Vielleicht so etwas?

text = text.replace(/(^|\s)(www(?:\.\w+){2,})/ig, "$1http://$2"); 

Dadurch werden die URLs in passen:

  • "www.example.com" -> "http://www.example.com"
  • "Visit www.example.com" -> "Visit http://www.exmaple.com"
  • "Visit www.example.co.uk" -> "Visit http://www.example.co.uk"

Aber nicht:

  • "http://www.example.com"
  • "ftp.example.com"
  • "www.com"
+0

Hinweis für alle, die die obige Regex für URLs mit einem Pfad verwenden möchten - der Pfad wird nicht ausgewählt. Versuchen Sie Folgendes: /(^|\s)(www(?:\.[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9) + & @ # \ /% = ~ _ |]) {2,})/ig – micahwittman

3

Macht das, was Sie wollen? Der Anker sorgt dafür, dass der Text mit www beginnt. Aber offensichtlich wird dies bei anderen Subdomains scheitern.

text = text.replace(/^www\.\w+\.\w+$/ig, "http://$&"); 

BEARBEITEN: Behoben dank Chris Lutz's Kommentar. Ich habe früher getestet, aber eine seltsame Kombination von Bugs (fehlender Anker, unescaped Dot, etc.) hat es anscheinend funktionieren lassen. Ich sollte wiederholen, dass dies ohnehin fragil ist.

+1

Nr auf Ihrer regex Implementierung Je, müssen Sie wahrscheinlich die entkommen ‚ 'S und fügen Sie ein‚s +‘nach dem‘ \ w. –

0

Sie können den ^ Indikatoren (Anker), um den Text zu verlangen, mit www beginnen entsprechen:

echo -e "http://www.example.com\nanythingwww.example.com\nwww.example.com" | grep "^www.example.com" 
www.example.com 
4

Sind Sie für das Auftreten von www.example.com in einer größeren Zeichenfolge gesucht? Vielleicht können Sie das konkretisieren, was Sie genau übereinstimmen soll, aber so etwas wie dies für Sie arbeiten kann:

text = text.replace(/(\s)(www\.\w+\.\w+)/ig, "$1http://$2"); 

Das Problem mit \b (die Wortgrenzen übereinstimmt) ist, dass es passt auch zwischen http:// und www, weil / kein Wortzeichen ist.

+0

Um ein wenig zu verdeutlichen: \ b stimmt genau dann überein, wenn das Zeichen auf einer Seite mit \ w übereinstimmt und das Zeichen auf der anderen Seite mit \ W übereinstimmt (die imaginären Zeichen vor und nach dem Ende der Zeichenfolge \ W.) – Cebjyre

0

Sie können eine negative Lookbehind Behauptung verwenden. Etwas wie ...

(?<!http\:\/\/)(?:www.example.com) 

+1

JavaScript-Regexes unterstützen keine Lookbehinds. –

+1

Leider unterstützt Javascript keine Lookbehind-Ausdrücke. – molf

+0

Blah! Ich wusste das nicht ... Entschuldigung! –

Verwandte Themen