遇到这样一个需求,从html的标签形式的字符串中提取出标签内的文字,比如在下面这个链接中,提取出“新闻”两个字。抛开博主为啥有这样的需求不谈,我们就说如何去实现:
link='<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>'
好用的exec()
exec()方法用于检索字符串中的正则表达式的匹配。它的强大之处在于,我们在正则表达式局部加上“小括号”之后,它会在整个表达式匹配成功后,将小括号内的匹配结果单独列出,并存放在数组中。比如我们写这样一条匹配语句:
link='<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>';
pattern=/<a .*?>(.*?)<\/a>/;
pattern.exec(link);
博主是在360极速浏览器中测试的,返回的结果如下,这是一个数组,数组的第二个值就是博主想要提取的标签内部文字:
(2) ["<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>", "新闻", index: 0, input: "<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>", groups: undefined]
如果把程序的最后一行修改为,那么程序会直接返回“新闻”这两个字符了:
pattern.exec(link)[1];
不同的元素标签
但是博主需要提取的不只是a标签,有时候也可能是label或者h1,所以希望能够动态的组合正则表达式,这个时候就需要用到“new RegExp()”了:
link='<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>'
"<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>"
before='<a .*?>'
after='</a>'
pattern=new RegExp(before+'(.*?)'+after)
我们把需要查找的内容放在小括号里,前后内容都用了变量代替,需要注意的是,直接赋值与利用RegExp生成的表达式,在console中的展现会有点不一样,但是也能够正确匹配:
//手动生成的结果
pattern=/<a .*?>(.*?)<\/a>/;
//函数生成的结果
pattern=/<a .*?>(.*?)</a>/;
但是如果把函数生成的结果再手动赋值,就会得到一个错误信息,提示“未捕获的SyntaxError:无效的正则表达式标志”:
Uncaught SyntaxError: Invalid regular expression flags