我想要替換所有出現的錯誤??? some.text.and.dots ???在一個html頁面上添加一個鏈接。我已經建立了這樣的正則表達式:Javascript正則表達式 - 匹配字符串模式,除非字符串在指定標記內
\?\?\?([a-z0-9。] *)\?\?\?
不過,我想排除任何結果這是一個內部鏈接:「<一... > ...我... PATTERN </A >」,和我有點卡住關於如何做到這一點,我所有的嘗試現在都失敗了。
我想要替換所有出現的錯誤??? some.text.and.dots ???在一個html頁面上添加一個鏈接。我已經建立了這樣的正則表達式:Javascript正則表達式 - 匹配字符串模式,除非字符串在指定標記內
\?\?\?([a-z0-9。] *)\?\?\?
不過,我想排除任何結果這是一個內部鏈接:「<一... > ...我... PATTERN </A >」,和我有點卡住關於如何做到這一點,我所有的嘗試現在都失敗了。
你真的不清楚你正在做什麼樣的「HTML」。如果它是HTML 代碼,可能是來自Ajax請求的東西,那麼您可以使用正則表達式;既匹配的鏈接或模式,然後制定出如何在回調做:
var html = document.body.innerHTML;
html = html.replace(/(<a\s.*?>.*?<\/a>)|(\?\?\?([a-z0-9.]*)\?\?\?)/g,
function (a, b, c, d) {
return (a[0] == '<') ? a : '<a href="#">' + d + '</a>';
});
context.innerHTML = html;
便利,replace()
can take a callback function作爲替代發電機,而不是一個簡單的字符串。
但是,如果您正在使用活動DOM樹,則可能需要尊重節點上的事件,而不是簡單地重置innerHTML
。你所需要的是多一點原始的辦法:
// returns all childnodes of type text that do not have A as parent
function walker (node) {
var nodes = [];
for (var c, i = 0; c = node.childNodes[i]; i++) {
if (c.nodeType === 1 && c.tagName !== 'A') {
nodes = nodes.concat(arguments.callee(c));
}
else if (c.nodeType === 3) {
nodes.push(c);
}
}
return nodes;
}
var textNodes = walker(document.body);
for (var i = 0; i < textNodes.length; i++) {
// create an array of strings separating the pattern
var m = textNodes[i].nodeValue.split(/(\?\?\?([a-z0-9.]*)\?\?\?)/);
if (m.length > 1) {
for (var j=0; j<m.length; j++) {
var t, parent = textNodes[i].parentNode;
// create a link for any occurence of the pattern
if (/^\?\?\?([a-z0-9.]*)\?\?\?$/.test(m[j])) {
var a = document.createElement('a');
a.href = "#";
a.innerHTML = RegExp.$1; // m[j] if you don't want to crop the ???'s
parent.insertBefore(a, textNodes[i]);
t = document.createTextNode(' '); // whitespace padding
}
else {
t = document.createTextNode(m[j]);
}
parent.insertBefore(t, textNodes[i]);
}
// remove original text node
parent.removeChild(textNodes[i]);
}
}
此方法僅觸及textnodes,然後只有那些匹配pattern的。
JavaScript本身並不支持後視。爲了做到這一點,你需要運行.match(),然後對每個匹配,你需要在你的標籤上進行匹配(比如/ < a \ s +。*?> /你的比賽,然後</a >賽後)。
祝你好運!
+1 「模仿Javascript中的Lookbehind」:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript – enobrev 2008-11-26 20:14:02
好詳細。令人印象深刻。 +1 – VonC 2008-11-27 07:44:32