Javascript 使用jquery遍历$(“body”部分标记除外
我正在遍历一个页面,使用jquery将Javascript 使用jquery遍历$(“body”部分标记除外,javascript,jquery,Javascript,Jquery,我正在遍历一个页面,使用jquery将添加到我的电话号码的特定正则表达式模式中。我正在使用$(“body:first”).html()成功地遍历页面,但是,我想排除一些标记,例如:,因为如果它们与我的正则表达式中的特定模式匹配,它们往往会破坏页面 我试过:$(“body:first”).not(“script”).not(“img”).html()没有成功。我遇到了一些我不感兴趣的内容。我有什么遗漏吗?我注销我的帐户 是否仍然可以使用.not()链接这些的倍数 您的代码应该可以工作,尽管您不想只
添加到我的电话号码的特定正则表达式模式中。我正在使用$(“body:first”).html()成功地遍历页面,但是,我想排除一些标记,例如:
,因为如果它们与我的正则表达式中的特定模式匹配,它们往往会破坏页面
我试过:$(“body:first”).not(“script”).not(“img”).html()代码>没有成功。我遇到了一些我不感兴趣的内容。我有什么遗漏吗?我注销我的帐户
是否仍然可以使用.not()链接这些的倍数
您的代码应该可以工作,尽管您不想只获取body,但您需要body中的所有元素
请尝试以下操作:
var-elements=$('body*')。not('script')。not('span')。get(0);
控制台日志(元素)代码>
并让它与您的正则表达式一起工作,并替换每个适用的文本节点
const phoneRegex = /555-555-5555/
const phoneMarkup = "<a href=\"tel:$&\">$&</a>"
const hyperlink = text => text.replace(phoneRegex, phoneMarkup)
$("body :not(:empty):not(script):not(img):not(svg)")
.contents()
.each(function() {
if (3 !== this.nodeType) return
const text = this.textContent
if (!text) return
const markup = hyperlink(text)
if (markup === text) return
$(this).replaceWith(markup)
})
constphoneregex=/555-555-5555/
const phoneMarkup=“”
const hyperlink=text=>text.replace(phoneRegex,phoneMarkup)
$(“正文:非(:空):非(脚本):非(img):非(svg)”)
.contents()
.each(函数({
如果(3!==this.nodeType)返回
const text=this.textContent
如果(!text)返回
常量标记=超链接(文本)
如果(标记===文本)返回
$(此).replaceWith(标记)
})
- 通过链接选择或通过带逗号的jQuery选择
$(“正文:非(:空):非(脚本):非(img):非(svg)”)
$(“正文:非(:空)”).not(“脚本、img、svg”)
- 迭代
- 跳过非文本节点
- 通过
- 跳过空节点
- 使用正则表达式替换超链接文本
- 避免过度的DOM操作
- 通过替换文本节点
在所有HTML内容上使用regex替换不是最好的主意,而且使用jQuery遍历所有潜在候选节点的成本可能相当高。就我理解你的问题而言,你只想在DOM textNodes中替换电话号码——在这种情况下,所有现代浏览器都有一个本机的、性能良好的
TreeWalker
——你可以将其配置为只遍历textNodes,并使用过滤方法进行一些额外的微调
在您的情况下,这意味着获取不在script
、style
和svg
标记中的所有文本节点。另外,a
标记应被忽略,因为嵌套的锚无效。首先,我们必须收集所有匹配的textNode,然后用regex替换它们的parentNode的内容
在我的示例中,我使用了匹配的textNode的.innerHTML
(不安全)和.replacetwith
,但如果操作正确,我们应该以一种方式更改正则表达式,即我们可以使用while(regex.exec(text))
来迭代匹配项,并将textNodes以及锚定标记附加到其父节点(将其内容重置为空后)
var phoneRegex=/(\b)((\+?[?]?1?\(?)([\s]?[\s-]?[\s]?[\s])(\(?[2-9]\d{2}\)([\s]?[\s-]?[\s.]?[\s])([2-9]\d{2}?([\s]?[\s-]?[\s]?[\s])(\d{4})/,
//这些节点类型可以有TextNode子节点,但我们会将它们过滤掉
excludeNodes=[“脚本”、“样式”、“SVG”、“A'],
//创建本机treeWalker实例,仅查找文本节点
//但忽略excludeNodes中的节点类型和
//与您的正则表达式不匹配
treeWalker=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT{
acceptNode:函数(节点){
if(excludeNodes.indexOf(node.parentNode.nodeName.toUpperCase())>-1
||!phoneRegex.test(node.data))返回NodeFilter.FILTER\u拒绝
返回NodeFilter.FILTER\u接受;
}
}),
textNodes=[];
//收集所有匹配的文本节点(我们无法实时替换
//节点,否则treewalker将中断)
while(treeWalker.nextNode())textNodes.push(treeWalker.currentNode);
//如果所有匹配的文本节点与phone regex匹配,则用span替换它们
//并将电话号码替换为“);
textNode.replaceWith(newNode);
});
1-888-452-1505
1(408)5625504
1.408.562.5504
1-613-3568772
(1) 9543615599
1.954.361.5599
+1.954.361.5599
954.361.5599
+1954361-5599
(954)361-5599
(954)361-5599
9543615599
(954)3615599
+19543615599
1-954-361-5599
+1-954-361-5599
954361-5599
前缀文本+1-954-361-5599
+1-954-361-5599发布文本
嵌套项
- 954361-5599
(954)3615599
日志(“请忽略我(954)3615599”)
一些svg数据,忽略电话号码,如+1-954-361-5599等。
更简单的方法是将要忽略的标记存储在一个数组中,并用于获取其内容的逗号分隔值。由于支持传递多个以逗号分隔的选择器,因此这将根据需要工作
另外,请确保使用body*
选择器选择body的所有子体,因为当前使用的子体仅选择body
元素
获取所有所需的元素后,您可以对它们进行迭代,并在每个元素上执行正则表达式,并在替换相应的部分后使用它们更新它们
示例:
/*----JavaScript---*/
常量正则表达式=/(\b)(\+?[?]?1?\(?)([\s]?[\s.]?[\s]?[\s])(\(?[2-9]\d{2}\)([\s]?[\s-]?[\s.]?[\s]?[\s])([2-9]\d{2}?([\s]?[\s-]?[\s.]s][\s])(\d{4})(\b)/;
const ignoredTags=[“脚本”、“svg”、“img”];
const wantedElements=$(“body*”).not(ignoredTags.toString());
wantedElements.每个(函数(索引,元素){
element.innerHTML=element.textContent.replace(regex,“”);
});