【发布时间】:2015-12-22 00:09:56
【问题描述】:
这是参考我上周发布的question。
我想查找页面上的所有有效电话号码。如果它们不在链接中,我想创建一个“点击通话”链接以在移动浏览器上使用。 我收到了关于我发布的原始问题的几个很好的答案,但想尝试不同的方法/扩展反馈。
我正在使用 jQuery 和 Regex 过滤页面内容并使链接可点击。
这是我想出的:
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 - 您是否有一个示例说明一旦以该格式找到已格式化的数字,我如何将其重新插入到 DOM 中?我是整个 XPath 解决方案的新手。
-
一旦找到节点,XPath 就不会真正参与。我已经扩展了我的原始答案,包括显示替换如何执行的代码;应该看看那个并删除这个问题。
标签: javascript regex nested filtering