2 Stimmen

JavaScript lehnt alle meine RegExs ab, wie kommt das?

Ich habe dies im Moment, (ich habe den Code hier gefunden).

     var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
     someText.replace(exp, "<a href='$1'>$1</a>");  

Sie ersetzt alle http://URL in someText mit einer eigenen <a href>

Aber ich brauche auch eine Übereinstimmung mit www. ohne das http. Ich fand diese RegEx auf RegEx Lib.

((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?

Und ich habe es auf der RegEx-Checker-Seite getestet, http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

Sie stimmt mit den gewünschten Zeichenfolgen überein. Aber wenn ich es in meine exp var setzen, ist JavaScript explodiert und verursacht einen Fehler.

Ich habe sogar versucht, sie als neue RegExp neu zu erstellen, etwa so.

var exp = new RegExp(((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?);

Aber es passiert das Gleiche.

Irgendwelche Ideen, was ich falsch mache?

Danke, Kohan

6voto

David Hellsing Punkte 101440

Ich glaube, der RegExp-Konstruktor nimmt eine Zeichenkette als Argument, siehe hier: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

Setzen Sie Ihre Regexp also einfach in Anführungszeichen und es sollte funktionieren.

var exp = new RegExp("((http\\://|https\\://|ftp\\://)|(www.))+(([a-zA-Z0-9\\.-]+\\.[a-zA-Z]{2,4})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\\?\\.'~]*)?");
someText.replace(exp, "<a href='$1'>$1</a>");

2voto

Alan Moore Punkte 70949

Okay, Sie haben die JavaScript-Syntax geklärt, jetzt lassen Sie uns über regex Syntax. Der Doppelpunkt ( : ) hat keine besondere Bedeutung, so dass es nicht notwendig ist, sie zu umgehen. Der Punkt ( . ) und Fragezeichen ( ? ) haben normalerweise eine besondere Bedeutung, jedoch nicht, wenn sie in einer Zeichenklasse (d. h. innerhalb der eckigen Klammern) erscheinen.

Der Bindestrich ( - ) tut haben eine besondere Bedeutung in einer Zeichenklasse: Sie bilden Bereiche, wie [a-z] y [0-9] . Wenn Sie einen Bindestrich in eine Zeichenklasse einfügen wollen, müssen Sie ihn entweder mit einem Backslash abschließen oder ihn an den Anfang oder das Ende der Liste setzen. Zum Beispiel, in [a-zA-Z0-9\.-] der letzte Bindestrich entspricht einem Bindestrich, während die anderen drei zur Bildung von Bereichen verwendet werden. (Der Backslash vor dem Punkt ist unnötig, schadet aber nicht).

Jetzt schauen Sie sich [a-zA-Z0-9%:/-_\?\.'~] . Die Backslashes vor den ? y . sind nur ein Durcheinander, aber der Bindestrich ist ein echtes Problem. Er bildet einen Bereich, der mit / und endet mit _ Wenn Sie sich eine ASCII-Zeichentabelle ansehen, werden Sie feststellen, dass sie die Ziffern 0-9 und Großbuchstaben A-Z sowie

/ , : , ; , < , = , > , ? , @ , [ , \ , ] , ^ , _

...offensichtlich nicht das, was der Autor beabsichtigt hat. Es gibt auch eine Menge unnötiger Gruppierungen und doppelten Code in dieser Regex, und müssen Sie wirklich auch IP-Adressen abgleichen? Die Moral von der Geschicht' ist: Traue nichts, was du auf RegExLib.com findest.

0voto

kalan Punkte 1636

Reguläre Ausdrücke in Javascript müssen von Schrägstrichen '/' umgeben sein, so dass sie wie folgt aussehen

var expr = /pattern/flags;

Für Sie ist der richtige Weg

var exp = /((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?/;

Wenn Sie den Konstruktor new RegExp() verwenden, rufen Sie ihn in einem Formular auf

var expr = new RegExp(pattern [, flags]);

hier sind Muster und Flaggen String-Parameter

var exp = new RegExp("((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X