這是我參考上週發佈的question。Javascript - 將所有電話號碼替換爲「點擊通話」鏈接中的鏈接
我想查找頁面上的所有有效電話號碼。如果他們還不在鏈接中,我想創建一個「點擊呼叫」鏈接,以便在移動瀏覽器上使用。 對於我發佈的原始問題,我收到了一些很好的答案,但想嘗試不同的方法/擴展反饋。
我正在使用jQuery和正則表達式來過濾頁面的內容,並使鏈接可點擊。
這裏是我想出來的:
var phoneRegex = new RegExp(/([(]?\d{3}[)]?[(\s)?.-]\d{3}[\s.-]\d{4})(?![^<]*>|[^<>]*<\/)/g);
var phoneNums = $("body *").filter(function() {
var tagname = $(this).prop("tagName");
tagname = tagname === null ? "" : tagname.toLowerCase();
if (tagname == "a") {
return false;
}
var match = $(this).html().match(phoneRegex);
if (match === null || match.length === 0) {
return false;
}
return true;
});
phoneNums.html(function() {
var newhtml = $(this).html().replace(phoneRegex, function(match) {
var phonenumber = match.replace(/ /g, "").replace(/-/g, "").replace(/\(/g, "").replace(/\)/g, "");
var link = '<a href="tel:' + phonenumber + '">' + match + '</a>';
return link;
});
return newhtml;
});
所以,基本上我尋找一切在體內尋找(不包括錨標籤),每個標籤。我匹配正則表達式並將值存儲在'phoneNums'變量中。 從那裏我刪除所有的空格,破折號和括號,因此號碼將正確格式爲tel屬性。 所以許多像這樣的:(123)456-7890將格式化像這樣:<a href="tel:1234567890">(123) 456-7890</a>
我做的是,如果這些數字都在頁面上嵌套的標籤,我得到的結果多看到的問題倍。 (如果你在鏈接上做一個console.log,就可以看到它,就在它返回之前。)結果是正確的,但是想知道這是否合理。
有沒有更有效的方法來做到這一點?提前致謝!
這就是爲什麼我在我的答案中使用了'XPath';它可以讓你直接找到文本節點,並處理它們,而無需使用正則表達式來解析/修改HTML。您希望儘可能低的工作量,而不是在'.html'上運行查找和替換(這意味着您正在替換大量可能包含'script'標籤,元素屬性等內容的東西)。 – ShadowRanger
@ShadowRanger - 你有沒有一個例子,我可以重新插入格式化的數字返回到DOM中,一旦找到了這種格式?我是整個XPath解決方案的新手。 – Tim
一旦找到節點,XPath實際上不會涉及。我已經擴展了我的原始答案,包括顯示如何執行替換的代碼;應該可以看看並刪除這個問題。 – ShadowRanger