猿问

各位大佬,帮我看一下js正则反向引用的问题(微信小程序内)

描述:后台给出一长串字符串,里面包括文本和链接,目前我需要做的就是将串解析成下面预期结果那样的一个数组,但是在正则引用那里出现了问题,假设原串中有三个链接,当前我自己的解析方法会造成最后一个覆盖前面两个链接的问题,不是预期的结果,麻烦各位大神有好的办法可以交流或者指导一下,谢谢
微信小程序内不支持直接操作dom
//原串
vardesc='出于HTTPS的安全策略,浏览器会阻断HTTPS上的非安全请求(HTTP)请求,但是我们可以使用被动混合内容的方式来跨越这个安全策略'+
'去看看怎么请求'+
'这时候,浏览器只会在控制台报warning,而不会block我们的请求。查看规则。'+
'因为攻击者可以通过不安全的HTTP内容来攻击安全的HTTPS页面去交互';
//目标串,类似这样,需要将原串里面的多个a链接处理成规定形式,并保持原串的各位置不变
/*
*'出于HTTPS的安全策略,浏览器会阻断HTTPS上的非安全请求(HTTP)请求,但是我们可以使用被动混合内容的方式来跨越这个安全策略'+
'去看看怎么请求'+
'这时候,浏览器只会在控制台报warning,而不会block我们的请求。查看规则。'+
'因为攻击者可以通过不安全的HTTP内容来攻击安全的HTTPS页面去绑定'
*
**/
//预期结果
[
{
'MsgType':'text',
'MsgContent':'出于HTTPS的安全策略,浏览器会阻断HTTPS上的非安全请求(HTTP)请求,但是我们可以使用被动混合内容的方式来跨越这个安全策略'
},
{
'MsgType':'navigator',
'MsgContent':'https://api.520.com/clientpage/money.php?url=xxx&title=xxx',
'MsgParam':'去看看怎么请求',
},
{
'MsgType':'text',
'MsgContent':'这时候,浏览器只会在控制台报warning,而不会block我们的请求。'
},
{
'MsgType':'navigator',
'MsgContent':'https://api.520.com/activity/convention.php?url=xxx&title=xxx',
'MsgParam':'查看规则',
},
{
'MsgType':'text',
'MsgContent':'因为攻击者可以通过不安全的HTTP内容来攻击安全的HTTPS页面'
},
{
'MsgType':'navigator',
'MsgContent':'/pages/goplay/goplay',
'MsgParam':'去交互',
},
]
varMsgBody=[];
varMsgContent=null,MsgType=null;
vartmsg='',amsg,restMsgIndex=null
varexpr=/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/mg
amsg=desc.match(expr);//匹配是否存在a链接
console.log(amsg)
if(!amsg||amsg.length<1){
MsgType='text';
MsgContent=desc;
MsgBody.push({
'MsgType':MsgType,
'MsgContent':MsgContent
})
}
else//存在a链接的情况
{
varlen=amsg.length;//a链接的个数
console.log(len)
for(vari=0;itmsg=desc.substring(0,desc.indexOf(amsg[i]));//最前面的文字
if(tmsg){//以文本开头
MsgType='text';
MsgContent=tmsg;
MsgBody.push({
'MsgType':MsgType,
'MsgContent':MsgContent
})
}
varpattern1=newRegExp("in://","ig");//以,分割in://mytrends
varpattern2=newRegExp("web://","ig");//以,分割web://http://api.yuepao520.cn:8009/clientpage/friend_raiders.php
varurl=amsg[i];
varparam='',src='';
MsgType='navigator';
/*
[^>]+#匹配a标签中href之前的内容
\bhref="([^"]*)"#匹配href的值,并将匹配内容捕获到分组1当中
[^>]*>#匹配a标签中href之后的内容
([\s\S]*?)#匹配a标签的value,并捕获到分组2当中,?表示懒惰匹配
#匹配a标签的结束
*/
newRegExp(']+\bhref="([^"]*)"[^>]*>([\s\S]*?)',"ig");//这里reg有缓存,导致了后面覆盖前面的
varlink=RegExp.$1;//这里是a链接href的内容
varalt=RegExp.$2;//这里是a链接可点击文字的内容
console.log(url,link,alt)
//解析两种预定义的a链接,解析成可识别链接
if(pattern1.test(url))//in开头类型的
{
switch(true){
casenewRegExp("goplay","ig").test(link):
src=app.globalData.navigateTo.goPlay;
break;
casenewRegExp("userinfo","ig").test(link):
vartemp=(link).split('?');
src=app.globalData.navigateTo.getUserInfo+'?'+temp[1];
break;
casenewRegExp("setmyinfo","ig").test(link):
src=app.globalData.navigateTo.setUserInfo;
break;
casenewRegExp("setting","ig").test(url):
break;
casenewRegExp("mytrends","ig").test(url):
break;
casenewRegExp("myphoto","ig").test(url):
break;
casenewRegExp("visitorrecord","ig").test(url):
break;
casenewRegExp("feedback","ig").test(url):
src=app.globalData.navigateTo.feedBack;
break;
casenewRegExp("vip_pay","ig").test(url):
src=app.globalData.navigateTo.vipRecharge;
break;
casenewRegExp("money_pay","ig").test(url):
src=app.globalData.navigateTo.goldRecharge;
break;
casenewRegExp("payment","ig").test(url):
src=app.globalData.navigateTo.goldRecharge;
break;
}
}
elseif(pattern2.test(url))//web开头类型的
{
src=(link).split('//');//替换成https,替换掉端口
if(src[1].indexOf("https")==-1){
param=src[1].replace(/http/,'https')+'//'+src[2];
param=param.replace(/:8891/,'')
}else{
param=src[1]+'//'+src[2]
}
//这种直接使用H5页面
//src=app.globalData.navigateTo.clientPage+'?url='+param+'&title='+alt
src='测试'+'?url='+param+'&title='+alt
}
MsgContent=amsg[i];
MsgBody.push({
'MsgType':MsgType,
'MsgContent':src,
'MsgParam':alt,
})
restMsgIndex=desc.indexOf(amsg[i])+amsg[i].length;
desc=desc.substring(restMsgIndex);
}
if(desc){//最后还存在文本
MsgType='text';
MsgBody.push({
'MsgType':MsgType,
'MsgContent':desc
})
}
}
ibeautiful
浏览 450回答 2
2回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答