2016-05-15 2 views
1

Ich arbeite an einem Syntax-Highlighter in Ruby. Aus diesem Eingabestring (pro Zeile verarbeitet):Wie kann ich Strings in Anführungszeichen auswählen, die außerhalb von HTML-Tags liegen?

"left"<div class="wer">"test"</div>"right" 
var car = ['Toyota', 'Honda'] 

Wie kann ich "left" und "right" in der ersten Zeile, 'Toyota' und 'Honda' in der zweiten Zeile finden?

Ich habe (["'])(\\\1|[^\1]*?)\1, um die zitierten Strings zu markieren. Ich kämpfe mit dem negativen Blick hinter einen Teil der Regex.

Ich habe versucht, eine andere Regex (?![^<]*>|[^<>]*<\/) anhängen, aber ich kann es nicht mit String in Anführungszeichen arbeiten. Es funktioniert nur mit einfachen alphanumerischen Zeichen.

+0

Können Sie klären, was Ihre Eingabezeichenfolge ist? –

+0

Die Frage wurde aktualisiert. –

+1

Wenn Sie einen HTML-Parser verwenden können, wenn Sie nicht wissen, dass Regex in bestimmten Fällen nicht ordnungsgemäß funktionieren kann. Probieren Sie ['<[^<>] *> | (" [^ "\\] * (?: \\. [^" \\] *) * "| '[^' \\] * (?: \\. [^ '\\] *) *') '] (http://rubular.com/r/MvmWNRnmtI) und erhalte die erste Erfassungsgruppe. Wenn Sie den Inhalt in Anführungszeichen setzen müssen, versuchen Sie ['<[^<>] *> | (?:" (? [^ "\\] * (?: \\. [^" \\] *) *) "| '(? [^' \\] * (?: \\. [^ '\\] *) *) ') '] (http://rubular.com/r/AIGeYlcIXJ) und bekomme nur die' q' genannte Capture-Gruppe –

Antwort

0

Sie ein oder mehrere Token entsprechen können, indem Gruppen Klammern in regex und unter Verwendung | eine oder Bedingung zu erstellen:

/("left")|("right")|('Toyota')|('Honda')/ 

Hier ein Beispiel:

http://rubular.com/r/C8ONnxKYEV

EDIT

Gerade sah die Kachel Ihrer Frage spezifi dass Sie außerhalb von HTML-Tags suchen möchten.

Leider ist dies nicht möglich, wenn nur reguläre Ausdrücke verwendet werden. Der Grund ist, dass HTML zusammen mit jeder Sprache, die Trennzeichen wie "", '', () erfordert, nicht regelmäßig sind. Mit anderen Worten, Regexen enthalten keine Möglichkeit, Ebenen der Verschachtelung zu unterscheiden. Daher müssen Sie einen Parser zusammen mit Ihrer Regex verwenden. Wenn Sie dies ausschließlich in Ruby tun, sollten Sie ein Tool wie Nokogiri oder Mechanize verwenden, um das DOM korrekt zu parsen und mit ihm zu interagieren.

+0

Ich sehe, das ist, was auch in einer anderen Frage vorgeschlagen wurde, danke. –

0

Beschreibung

Diese erste Ruby-Skript findet und die HTML-Tags ersetzt, beachten Sie dies ist nicht perfekt, und ist anfällig für Fälle viele Rand. Dann sucht das Skript nur nach allen einfachen und doppelten Anführungszeichen.

str = %Q["left" <div class="wer">"test"</div>"right"\n] 
str = str + %Q<var car = ['Toyota', 'Honda']>  
puts "SourceString: \n" + str + "\n\n" 

str.gsub!(/(?:<([a-z]+)(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?>).*?<\/\1>/i, '_') 
puts "SourceString after replacement: \n" + str + "\n\n" 

puts "array of quoted values" 
str.scan(/"[^"]*"|'[^']*'/) 

Beispielausgabe

SourceString: 
"left" <div class="wer">"test"</div>"right" 
var car = ['Toyota', 'Honda'] 

SourceString after replacement: 
"left" _"right" 
var car = ['Toyota', 'Honda'] 

=> ["\"left\"", "\"right\"", "'Toyota'", "'Honda'"] 

Live-Beispiel

https://repl.it/CRGo

HTML Parsing

empfehle ich Verwenden Sie stattdessen eine HTML-Parsing-Engine. Dieser scheint ziemlich anständig für Ruby zu sein: https://www.ruby-toolbox.com/categories/html_parsing

+0

Ich würde die gefundene Zeichenfolgen in einem Span umwickeln, aber wie würde ich die vorherigen HTML-Tags an der richtigen Stelle mit Ihrer Lösung austauschen? löste es bereits @ WiktorStribiżews Ausdruck in seinem Kommentar. –

+0

Das ist jenseits des Umfangs Ihrer ursprünglichen Frage, wo Sie einfach nach dem gefundenen Zitat gefragt haben Saiten. Mit diesen neuen Informationen empfehle ich, eine HTML-Parsing-Engine zum Suchen und Ersetzen zu verwenden. Dies könnte mit https://www.ruby-toolbox.com/categories/html_parsing oder über jquery nach dem Laden der Seite erreicht werden. –

+0

Es ist innerhalb der Details der Frage, die Auswahl der Zeichenfolge in Anführungszeichen ist nur ein Teil der Gesamtlösung, aber trotzdem danke. –

Verwandte Themen