2010-06-12 15 views
5

Angenommen, Sie haben eine Zeichenfolge: "Die ABC-Kuh sprang über XYZ den Mond" und Sie möchten mit jQuery die Teilzeichenfolge zwischen "ABC" und "XYZ" abrufen ? Der Teilstring sollte "Kuh übersprungen" sein. Danke vielmals!Verwenden von jQuery zum Suchen einer Teilzeichenfolge

+0

Zunächst einmal setzen Sie ein jQuery nicht String-Manipulation zu tun -, dass Javascript/ECMAScript ist. Zweitens, können Sie genauer über die Logik sein, die verwendet wird, um diese Zeichenfolge zu erfassen? Gibt es ein Muster? –

+0

Frage zu jQuery nicht mit jQuery getaggt –

+0

Nun, warum brauchen Sie jQuery? kann nicht einfach Javascript für Sie arbeiten –

Antwort

6

Dies hat nichts mit jQuery zu tun, das hauptsächlich für DOM-Traversal und -Manipulation gedacht ist. Sie wollen einen einfachen regulären Ausdruck:

var str = "The ABC cow jumped over XYZ the moon"; 
var sub = str.replace(/^.*ABC(.*)XYZ.*$/m, '$1'); 

Die Idee ist, dass Sie ein String.replace mit einem regulären Ausdruck verwenden, die Ihre Öffnen und Schließen Trennzeichen übereinstimmt und mit dem Teil zwischen den Trennzeichen abgestimmt die gesamte Zeichenfolge zu ersetzen.

Das erste Argument ist ein regulärer Ausdruck. Die nachgestellte m bewirkt, dass es über mehrere Zeilen übereinstimmt, was bedeutet, dass Ihr Text zwischen ABC und XYZ Zeilenumbrüche enthalten kann. Der Rest setzt sich wie folgt zusammen:

  • ^ Start am Anfang des Strings
  • .* eine Reihe von 0 oder mehr Zeichen
  • ABC Ihre Eröffnungszeichen
  • (.*) Spiel eine Reihe von 0 oder mehr Zeichen
  • XYZ Ihr schließendes Trennzeichen
  • .* eine Reihe von 0 oder mehr Zeichen
  • $ Spiel bis zum Ende des Strings

Der zweite Parameter, die Ersatzzeichenfolge ist '$ 1'. replace ersetzt in eckigen Klammern submatchs von Ihrem regulären Ausdruck - der (.*) Teil von oben. Somit ist der Rückgabewert die gesamte Zeichenfolge, die durch die Teile zwischen den Begrenzern ersetzt wird.

+0

Ich dachte, jQuery hat Funktionen: substring und indexof, und diese können möglicherweise zusammen verwendet werden, um die Teilzeichenfolge zu erhalten. – Steve

+0

Können Sie kurz erklären, wie das funktioniert: str.replace (/^.* ABC (. *) XYZ. * $ /, '$ 1'); – Steve

+0

@Steve - Es ist JavaScript, das Funktionen wie substring und indexof hat. jQuery befasst sich hauptsächlich mit dem DOM einer Seite. –

3

Möglicherweise müssen Sie jQuery nicht verwenden. Ich würde so etwas tun:

function between(str, left, right) { 
    if(!str || !left || !right) return null; 
    var left_loc = str.indexOf(left); 
    var right_loc = str.indexOf(right); 
    if(left_loc == -1 || right_loc == -1) return null; 
    return str.substring(left_loc + left.length, right_loc); 
} 

Keine garantiert der obige Code ist fehlerfrei, aber die Idee ist es, die Standard substring() Funktion zu verwenden. Nach meiner Erfahrung funktionieren diese Arten von Funktionen in allen Browsern gleich.

+0

Danke für die Hilfe !! – Steve

+0

Ich mag diesen, weil ich Regex hasse, frage mich, ob das ein guter Grund ist :) – henrijs

0

Nur um Ihnen zu zeigen, wie Sie jQuery und meagars Regex verwenden würden. Lassen Sie uns sagen, dass Sie eine HTML-Seite mit dem folgenden P Tag haben:

<p id="grabthis">The ABC cow jumped over XYZ the moon</p> 

die Zeichenfolge zu packen, würden Sie den folgenden jQuery/JavaScript-Mix verwenden (klingt irgendwie dumm, da jQuery JavaScript, aber sehen jQuery als JavaScript-DOM-Bibliothek):

$(document).ready(function() { // Wait until the document has been fully loaded 
    var pStr=$("#grabthis").text(); // Grab the text from the P tag and put it into a JS variable 
    var subStr=pStr.replace(/^.*ABC(.*)XYZ.*$/m, '$1'); // Run the regex to grab the middle string 

    alert(subStr); // Output the grabbed middle string 
}); 

oder die kürzere Version:

$(document).ready(function() { 
    alert($("#grabthis").text().replace(/^.*ABC(.*)XYZ.*$/m, '$1')); 
}); 

die ersetzen-Funktion eine JavaScript-Funktion ist. Ich hoffe, das löscht die Verwirrung.

1

Meagar, Ihre Erklärung ist großartig und erklärt klar, wer es funktioniert.

Nur ein paar kleine Fragen:

  • Sind die() Klammer nur erforderlich, als eine Möglichkeit, einen submatch im zweiten Parameter der relpace Funktion, um anzuzeigen, oder würde dies erkennen auch die submatches:/^. *ABC. XYZ. $/aber funktioniert nicht für das, was wir in diesem Fall versuchen?

  • Enthält diese regulären Ausdruck haben 7 submatches:...

^
*
ABC
*
XYZ
*
$

  • Ist die $ 1 bedeutet, die fi zu verwenden erstes geklammertes Submatch? Zuerst dachte ich, es könnte bedeuten, das zweite Submatch in der Serie zu verwenden (das erste ist $ 0).

Danke,

Steve

Verwandte Themen