当前位置:嗨网首页>书籍在线阅读

07-分支

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

17.6 分支

如果有一个以字符串形式存储的HTML页面,想找出其中所有引用外部资源的标签( <a><area><link><script><source> ,有时候还有 <meta> )。此外,可能还有一些标签是混合大小写的(例如 <Area><LINKS> )。正则表达式中的分支可以解决这个问题:

const html = 'HTML with <a href="/one">one link</a>,and some JavaScript.' +
   '<script src="stuff.js"></script>';
const matches = html.match(/area|a|link|script|source/ig);  // 第一次尝试

竖线(|)是一个正则表达式元字符,它表示分支。ig表示忽略大小写(i)和全局搜索(g)。没有g的话,只会返回第一个匹配项。这个正则表达式会被解读为“查找文本中所有的area、a、link、script或source,并忽略大小写”。聪明的读者可能会好奇为什么把area放在a之前,这是因为正则表达式是从左到右执行分支匹配的。换句话说,如果字符串包含了area标签,它会匹配上a然后继续移动。此时a会被消费,而rea则匹配不上任何元素。所以必须先匹配area,然后再匹配a,否则,area将匹配失败。

如果运行这个例子,会发现有很多意料之外的匹配项:单词link(在标签内部),字母a不是一个HTML标签,它只是英文单词中的一部分。解决这个问题的一个办法是将正则表达式修改为 /<area|<a|<link|<script|<source/ (尖括号不是正则表达式元字符),但即便如此,还是会遇到更加复杂的情况。