2015-12-07 17 views
9

i in regex arbeitete mein regex ist /\[([^]\s]+).([^]]+)\]/g dies für [http://sdgdssd.com fghdfhdhhd] in PHP funktioniert gut, aber wenn ich diese Regex verwende für JavaScript mit dieser Eingabezeichenfolge nicht, was der Unterschied zwischen PHP Regex ist und Javascript regex

entspricht mein Eingang ist [http://sdgdssd.com fghdfhdhhd]

+1

Sie sicher, dass Ihre Aussage ist richtig? Ich könnte mir '/ \ [([^] \ s] +) vorstellen. ([^]] +) \]/G' könnte in JS funktionieren, aber nicht in PHP; PHP hat andere Modifikatoren als JS. 'g' ist kein PHP-Modifier. – chris85

+0

Dies funktioniert auf PHP Sie können es überprüfen, indem Sie auf https://regex101.com ausführen –

+1

regex101 ist kein PHP-Interpreter. Das ist nur ein Regex-Tester. https://eval.in/481587 Siehe http://php.net/manual/en/reference.pcre.pattern.modifiers.php Die Regex ist gültig, wird aber in PHP mit diesem Modifier nicht funktionieren. Die PHP-Funktionen sind bereits global oder es gibt eine Funktion, damit sie global ist (preg_match_all vs. preg_match). – chris85

Antwort

7

In JavaScript Regex, müssen Sie immer die ] innerhalb einer Zeichenklasse entkommen:

\[([^\]\s]+).([^\]]+)\] 

Siehe regex demo

JS [^] als * ein beliebiges Zeichen einschließlich Newline in Ihrem regulären Ausdruck analysiert, und das letzte Zeichen Klasse ] Symbol als wörtliche ].

In dieser Hinsicht weicht JS Regex-Engine aus dem POSIX standard wo intelligente Platzierung verwendet wird [ und ] Symbole mit eingeklammerten Ausdrücke wie [^][] übereinstimmen.

Das ] Zeichen als Literal Zeichen behandelt, wenn es das erste Zeichen nach ^ ist: [^]abc].

In JS and Ruby, das funktioniert nicht so:

Sie können eine unescaped schließende Klammer umfassen, indem sie es direkt nach der öffnenden Klammer oder direkt nach dem Negieren caret platzieren. []x] entspricht einer schließenden Klammer oder einem x. [^]x] entspricht einem beliebigen Zeichen, das keine schließende Klammer oder x ist. Dies funktioniert nicht in JavaScript, das [] als leere Zeichenklasse behandelt, die immer nicht übereinstimmt, und [^] als eine leere leere Zeichenklasse, die mit einem einzelnen Zeichen übereinstimmt. Ruby behandelt leere Zeichenklassen als Fehler. So benötigen sowohl JavaScript als auch Ruby, dass schließende Klammern mit einem Backslash versehen werden müssen, um sie als Literale in eine Zeichenklasse einzubeziehen.

+3

Das ist seltsam, dass das '' 'in PCRE nicht maskiert werden muss. Ich bin immer nur aus Instinkt entkommen, weil ich dachte, dass es daran ersticken würde, wenn nicht. – chris85

+0

@ chris85: Ich habe gerade die Antwort editiert, da ich double checked und gefunden habe, dass '[' in einer Zeichenklasse in JS nicht maskiert werden muss. –

+0

Weitere Erläuterungen zu diesem Problem hinzugefügt. –

0

Ich möchte diese kleine Tatsache hinzufügen zu übersetzen PHP preg_replace Regex in JavaScript .replace Regex:

<?php preg_replace("/([^0-9\,\.\-])/i";"";"-1 220 025.47 $"); ?> 
Result : "-1220025.47" 

mit PHP, müssen Sie die Anführungszeichen "..." um die Regex verwenden, einen Punkt Komma zu trennen die Regex mit dem Austausch und den Klammern als Wiederholung Forschung (Hexe bedeutet nicht die gleiche Sache überhaupt.

<script>"-1 220 025.47 $".replace(/[^0-9\,\.\-]/ig,"") </script> 
Result : "-1220025.47" 

mit JavaScript, kein qu otes um den Regex, ein Komma, um Regex mit dem Ersatz zu trennen und Sie müssen /g Option verwenden, um mehrere Forschung zusätzlich zu der /i Option zu sagen (deshalb /ig).

Ich hoffe, dass dies für jemanden nützlich sein wird! Beachten Sie, dass die "\," kann bei "1,000.00 $" (Englisch?) Art von Nummer unterdrückt werden:

<script>"-1,220,025.47 $".replace(/[^0-9\.\-]/ig,"")</script> 
<?php preg_replace("/([^0-9\.\-])/i";"";"-1,220,025.47 $"); ?> 
Result : "-1220025.47" 
Verwandte Themen