Hier ist ein weiterer Ansatz, basierend auf dynamisch ein regexp Aufbau:
function wikifyText (startString, endString, text, list) {
list = list.map(function (str) {
return str.replace(/([^a-z0-9_])/g, '\\$1');
});
list.sort();
list.reverse();
var re = new RegExp('\\b(' + list.join('|') + ')\\b', 'g');
return text.replace(re, startString + '$1' + endString);
}
(JSFiddle)
Die \b
Anker an beiden Enden des regexp diese Version verhindern versuchen, alle Teile Worte wikify, aber Sie könnten diese Einschränkung lockern, wenn Sie wollten. Zum Beispiel ersetzen regexp Konstruktion mit:
var re = new RegExp('\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g');
würde ein s
oder es
Suffix am Ende des letzten Wortes wikified (JSFiddle) ermöglichen. Beachten Sie, dass MediaWiki automatisch solche Suffixe als Teil des Linktextes einfügt, wenn die Seite angezeigt wird.
Edit: Hier ist eine Version, die die ersten Buchstaben jeden Satzes ermöglicht auch Groß- und Kleinschreibung zu sein, wie MediaWiki Seitentitel sind. Es ersetzt auch die \b
Anker mit einer etwas Unicode freundliche Lösung:
function wikifyText (startString, endString, text, list) {
list = list.map(function (str) {
var first = str.charAt(0);
str = first.toUpperCase() + first.toLowerCase() + str.substr(1);
str = str.replace(/(\W)/ig, '\\$1');
return str.replace(/^(\\?.\\?.)/, '[$1]');
});
list.sort();
list.reverse();
var re = new RegExp('(^|\\W)(' + list.join('|') + ')(?=(e?s)?\\W)', 'g');
return text.replace(re, '$1' + startString + '$2' + endString);
}
(JSFiddle)
Dieses viel weniger chaotisch wäre, wenn JavaScript solche Standard PCRE Funktionen wie Groß- und Kleinschreibung Abschnitte unterstützt regexps, Look-Behind- oder Unicode-Zeichenklassen.
Insbesondere aufgrund der letzten dieser fehlenden Features, auch diese Lösung noch nicht vollständig ist Unicode-aware: es insbesondere Verbindungen nach oder beginnen kann, bevor ein Zeichen enden, die \W
übereinstimmt, die Interpunktion enthält aber auch alle Nicht-ASCII-Zeichen, sogar Buchstaben. (Nicht-ASCII-Buchstaben innerhalb Links werden jedoch korrekt behandelt.) In der Praxis glaube ich nicht, dass dies ein großes Problem sein sollte.
Ich frage im Wesentlichen, ob es möglich ist, eine Zeichenfolge innerhalb einer anderen Zeichenfolge zu ersetzen, wenn und nur wenn es nicht zwischen zwei anderen Zeichenfolgen ist. (Ersetze beispielsweise die Zeichenkette "str1" innerhalb der Zeichenkette "str2", genau dann, wenn "str2" nicht zwischen den Zeichenketten "str3" und "str4" liegt). –
sollte das lesen '// Diese Funktion würde zurückkehren" Dies ist der [[Text]] zu [[wikify]] "als Ausgabe? – kieran
Es könnte möglich sein, dies mithilfe der Lookahead- und Lookbehind-Operatoren in einem regulären JavaScript-Ausdruck zu tun, aber ich bin mit der Syntax für reguläre Ausdrücke nicht vertraut. –