2016-04-04 10 views
1

Ich arbeite an einem HTML-Tool, um alte lateinische Sprache zu studieren. Es ist eine Übung, bei den Schüler auf einig Wort klicken haben, , in dem es ein div mit einem Stück lateinisch:Regulärer Ausdruck, um Wörter mit akzentuierten Zeichen aus dem Lateinischen zu trennen

<div class="clickable"> 
        Cum a Romanis copiis vincĭtur măr, Gallia terra fera est. 
Regionis incŏlae terram non colunt, autem sagittis feras necant et postea eas vorant. 
Etiam a_femĭnis vita agrestis agĭtur, 
miseras vestes induunt et cum familiā in parvis casis vivunt. 
Vita secūra nimiaeque divitiae a Gallis contemnuntur. 
Gallorum civitates acrĭter pugnant et ab inimicis copiis timentur. 
Galli densis silvis defenduntur, tamen Roma feram Galliam capit. 
</div>  

In meinem Javascript wickeln wir alle einzelnen Worte in ein <span> mit einem regulären Ausdruck, und ich wende einige Aktionen an.

var words = $('div.clickable');   
    words.html(function(index, oldHtml) { 
     var myText = oldHtml.replace(/\b(\w+?)\b/g, '<span class="word">$1</span>') 

     return myText; 
    }).click(function(event) { 
     if(!$(event.target).hasClass("word"))return; 
     alert($(event.target).text()); 
    } 

Das Problem ist, dass die Worte, die ĭ, ŏ, ā enthalten, sind nicht richtig eingewickelt, sondern sind entsprechend diesen Zeichen aufgeteilt.

Wie kann ich diese Klasse von Wörtern richtig zuordnen?

JS Fiddle

+1

Versuchen Sie es mit [XRegExp] (https: // cdnjs. cloudflare.com/ajax/libs/xregexp/2.0//xregexp-all-min.js) –

+0

Siehe [diese Antwort] (http://stackoverflow.com/a/280762/160386) für weitere Vorschläge. –

Antwort

4

Sie Ihren Text durch den Teiler geteilt werden. Im allgemeinen Fall kann es Raum oder andere Satzzeichen sein:

(.+?)([\s,.!?;:)([\]]+) 

https://regex101.com/r/xW4pF1/5

bearbeiten

var words = $('div.clickable');   
words.html(function(index, oldHtml) { 
    var myText = oldHtml.replace(/(.+?)([\s,.!?;:)([\]]+)/g, '<span class="word">$1</span>$2') 

    return myText; 
}).click(function(event) { 
    if(!$(event.target).hasClass("word"))return; 
    alert($(event.target).text()); 
} 

https://jsfiddle.net/s568c0pp/3/

+0

Dieser Ansatz funktioniert gut, aber passen auch die Teiler, wie Punktionen aus dem Ergebnis auszuschließen? – cesare

+0

Es entspricht 2 Gruppen: Wort und Teiler. Verwenden Sie also in Ihrer Replace-Funktion beide als Ersatz: 'oldHtml.replace (/ (. +?) ([\ S \, \. \! \?] +)/G, ' $ 1 $ 2 ') 'https://jsfiddle.net/s568c0pp/2/ – Slavik

+0

Es funktioniert perfekt. – cesare

0

Das ist \w Meta-Zeichen verwendet, um ein Wortzeichen zu finden, von a-z, A-Z, 0-9, einschließlich der _ (Unterstrich) Zeichen. Sie müssen also Ihre Regex ändern, um den Bereich der Unicode-Symbole anstelle von \w zu verwenden.

Sie können auch \p{L} anstelle von \w versuchen, um jedes Unicode-Zeichen zu finden.

Siehe auch: http://www.regular-expressions.info/unicode.html

+0

Ich habe versucht mit/\ b (\ p {L} +?) \ B/g aber stimmt mit keinem Wort überein. – cesare

+1

Entschuldigung, JavaScript Regex-Engine ist ein bisschen anders. Gib mir ein paar Minuten ... Ich überprüfe die Alternative. –

+0

Danke, ich habe gelöst. – cesare

Verwandte Themen