2016-12-21 4 views
1

Ich bin derzeit auf der Suche nach einem Weg, um passenden Text in eine Fett HTML-Zeile zu verwandeln. Ich habe es teilweise arbeiten, außer für Sonderzeichen, die mir Probleme geben, weil ich die ursprüngliche Zeichenfolge beibehalten möchte, aber nicht die ursprüngliche Zeichenfolge vergleichen.Vergleichen und ersetzen Sie einen Teilstring beim Ignorieren von Sonderzeichen

Beispiel:

die ursprüngliche Zeichenfolge Gegeben:

Taco John's is my favorite place to eat. 

und wollen entsprechen:

is my 'favorite' 

das gewünschte Ergebnis zu erhalten:

Taco John's <b>is my favorite</b> place to eat. 

So wie ich bin momentan g in der dazu passenden String um die zusätzlichen Anführungszeichen etting ist von ihnen

let regex = new RegExp('('+escapeRegexCharacters(matching_text.replace(/[^a-z 0-9]/gi,''))+')',"gi") 
let html= full_text.replace(/[^a-z 0-9]/gi,'').replace(regex, "<b>$1</b>")}}></span> 

außer Dieser fast funktioniert, zu ersetzen, dass ich verlieren alle Zeichensetzung:

Taco Johns <b>is my favorite</b> place to eat 

Gibt es eine Möglichkeit Regex zu verwenden, oder ein anderes Verfahren, Tags während des Matching-Vorgangs um eine passende Wortgruppe zu ergänzen, während sowohl Groß- als auch Sonderzeichen ignoriert werden?

UPDATE # 1:

Es scheint, dass ich nicht klar bin zu sein. Ich brauche die Punktierung der ursprünglichen Zeichenfolge, um im HTML des Endergebnisses zu bleiben. Und ich brauche die übereinstimmende Textlogik, um alle Sonderzeichen und die Großschreibung zu ignorieren. So sollten is my favoriteis My favorite und is my 'favorite' alle eine Übereinstimmung auslösen.

+0

Der ganze Sinn der Regex Du zur Verfügung gestellt hast, ist alles zu entfernen, die nicht ‚az‘ ist (Leerzeichen) oder Ziffern. Also nur Ihre Satzzeichen entfernen: https://regex101.com/r/M9HrNF/1 –

+0

Wenn Sie Regex-Zeichen erfolgreich entkommen, warum müssen Sie nicht alphanumerische + Leerzeichen entfernen? – Scimonster

+0

@DoTheDew Richtig, jetzt entferne ich die Interpunktion, um eine Übereinstimmung zu erhalten, aber ich möchte die Interpunktion im Endergebnis behalten, aber passende Logik, die Sonderzeichen entfernt. –

Antwort

1

Statt die Sonderzeichen zu entfernen aus Wenn Sie die gesuchte Zeichenfolge suchen, können Sie in Ihren regulären Ausdruck ein Muster zwischen den einzelnen Zeichen einfügen, das alle eventuell auftretenden Sonderzeichen überspringt. So können Sie einen regulären Ausdruck erstellen, die direkt auf die Zeichenfolge angewendet werden kann, durchsucht, und der Austauschvorgang wird somit nicht die Sonderzeichen außerhalb der Spiele berühren:

let escapeRegexCharacters = 
 
     s => s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 
 
    full_text = "Taco John's is My favorite place to eat."; 
 
    matching_text = "is my 'favorite'"; 
 
    regex = new RegExp(matching_text.replace(/[^a-z\s\d]/gi, '') 
 
       .split().map(escapeRegexCharacters).join('[^a-z\s\d]*'), "gi"), 
 
    html = full_text.replace(regex, "<b>$&</b>"); 
 

 
console.log(html);

+0

Das ist fast genau richtig. Es schlägt jedoch fehl, wenn Großschreibung nicht übereinstimmt. Wenn also der passende Text "is My 'favorite'" ist, passt er nicht, aber ich brauche ihn. Deshalb habe ich die "i" -Flagge verwendet, ist das möglich mit der Methode der Zeichenabgleichung? –

+0

Angepasst: Das Argument 'gi' wurde zum' 'new RegExp()' hinzugefügt. – trincot

+0

Ich sehe, ich habe versucht, die 'gi' Flagge an der falschen Stelle hinzuzufügen. Vielen Dank! Das war sehr schlau. –

1

Regexps sind nützlich, wenn es ein Muster ist, aber in diesem Fall, dass Sie ein direktes Spiel haben, so der gute Ansatz nutzt eine String.prototype.replace:

function wrap(source, part, tagName) { 

    return source 
    .replace(part, 
     `<${tagName}>${part}</${tagName}>` 
    ) 
    ; 
} 

Zumindest, wenn es eine Muster, sollten Sie Ihre Frage bearbeiten und bereitstellen.

+0

Das ist wahr, außer dass replace genau passende Sonderzeichen ist. "Taco John's ist mein Lieblingsplatz zum Essen.". Replace ("ist mein 'Favorit'", "ALLES") 'wird nicht funktionieren wegen der zusätzlichen einfachen Anführungszeichen in der 'Teil' Variable. –

0

Es ist möglich, eine Capture-Gruppe mit dem $& replacement string zu vermeiden, mit, die „gesamte abgestimmte Teilkette“ bedeutet:

var phrase = "Taco John's is my favorite place to eat." 
var matchingText = "is my favorite" 

var re = new RegExp(escapeRegexCharacters(matchingText), "ig"); 
phrase.replace(re, "<b>$&</b>"); 

(auf obarakon Antwort Kodex.)

0

Generalisierung, die Regex könnten Sie is my /w+ verwenden.Sie können, dass in einer replacer Funktion verwenden, so dass Sie Javascript, um den resultierenden Text bearbeiten können:

var str = "Taco John's is my favorite place to eat."; 
 
var html = str.replace(/is my \w*/, function (x) { 
 
    return "<b>" + x + "</b>"; 
 
}); 
 

 
console.log(html);

Verwandte Themen