经典JavaScript正则表达式实战(附pdf)(5)


<script type="text/javascript">
function findLinks(str){
var reg = /<a\s(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*(\s*href\s*=\s*"https://www.jb51.net/article/.+?")(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")
*\s*>[\s\S]*?<\/a>/g;
var arr = str.match(reg);
for(var i=0;i<arr.length;i++){
//alert(arr[i]);
document.write('link:'+arr[i]+'<br />');
}
}
var str = '<p>测试链接:<a id = "test" href="https://bbs.blueidea.com" title="无敌">经典论坛
</a></p><a? href = "http://www.blueidea.com/"? >蓝色理想</a>';
var arr = findLinks(str);
</script>


会把所有的链接在页面直接显示出来。注意,

本帖遗留问题:如何执行从右到左的匹配。貌似JS或者VBS没有提供这个功能2、JS或者VBS不支持 后行断言。。用什么方法实现这个功能。

匹配链接的文字
来源:求一正则?

代码:<a href="#>这里要保存</a>,只保存链接的文本内容,标签信息删掉。

前面写过一个匹配链接的正则:

/<a\s(\s*\w*?="https://www.jb51.net/article/.+?")*(\s*href="https://www.jb51.net/article/.+?")(\s*\w*?="https://www.jb51.net/article/.+?")*\s*>[\s\S]*?<\/a>/

不过我们需要捕获的是文字内容,所以需要做一定的修改。第一步就是在所有的括号内都加上?:表示不捕获。第二步就是再多加一个括号放在[\s\S]*?两侧,这样就可以捕获到链接的文字内容了。最后正则如下:

/<a\s(?:\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*(?:\s*href\s*=\s*"https://www.jb51.net/article/.+?")(?:\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*\s*>([\s\S]*?)<\/a>/测试代码如下:

复制代码 代码如下:


<script type="text/javascript">
function anchorText(str){
var reg =https://www.jb51.net/<a\s(?:\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*(?:\s*href\s*=\s*"https://www.jb51.net/article/.+?")(?:\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*\s*>

([\s\S]*?)<\/a>/;
str = str.replace(reg,'$1');
return str;
}
var str = '<a id = "test" href="https://bbs.blueidea.com" title="无敌">经典论坛</a>';
document.write(anchorText(str));
</script>


正则判断标签是否闭合
来源:求助 超难!正则表达式如何判断一个标签是否闭合

例如:<img xxx=”xxx” 就是没有闭合的标签;

<p>p的内容,同样也是没闭合的标签。

从简单的正则开始,先匹配起始标签

/<[a-z]+/i再加上若干属性:

/<[a-z]+(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*/i
下面就到关键点了,标签的闭合。标签可能有两种方式闭合,<img xxx=”xxx” />

或者是<p>xxx </p>。

(\s*\/>)

匹配img类的结束,即/>。

(\s*?>[\s\S]*?<\/\1>)

匹配\p类标签的结束标签。>是其实标签末尾,之后是标签内容若干个任意字符,最后的<\/\1>就是结束标签了。

加上一个或就可以解决了,最后的完整正则表达式:

整个正则:

/<([a-z]+)(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*(\s*?>[\s\S]*?<\/\1>|\s*\/>)/i
拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如

<div>aaaaaa<div>test</div>

也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下:

/<([a-z]+)(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i
用正则获得指定标签的内容
来源:求一正则

有如下代码:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfydjs.html