我必须使用一个完全没有写好的小部件。所以它使用document.write返回一个包含一些错误代码的函数,我不想将它插入到我的页面中。这是返回的内容:
if (position == 'Right') {
document.write('<A HREF="xxxxxx/xxxx/xxx- www.xxxx.com/xxxx/default/empty.gif/1?x" target="_top"><IMG SRC="https://cdn.oas-c17.adnxs.com/RealMedia/ads/Creatives/default/empty.gif/0" WIDTH=1 HEIGHT=1 ALT="" BORDER=0 BORDER="0"></A>');
}
相反,我使用ajax调用以纯文本形式获取所有内容,而我所需要的仅仅是上述文本的href和src的结果。所以我需要解析文本并得到:
https://xxxx-www.xxxx.com/xxx/home/1735871518/Right/default/empty.gif/1?x
和
https://cdn.oas-c17.adnxs.com/RealMedia/ads/Creatives/default/empty.gif/0
以下是我要求获得纯文本的电话:
function getTodaysAd() {
$.ajax({
url : "https:xxxxxxxxxx",
dataType : 'text',
cache : false,
success : function(data) {
alert();
console.log(data);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
}
});
}
因为我通常用JSON重新获得所有内容,所以我很难解析这个纯文本。它是通过正则表达式来实现的吗?
答案 0 :(得分:1)
首先,您可以使用此正则表达式从响应中提取<a>
标记:
var markup = data.match(/document.write\s?\('([^']*)'/i);
// searches for "document.write (' [...] '"
您的markup[1]
变量应该包含该函数将要写入的所有标记,如下所示:
<A HREF="xxxxxx/ads/click_lx.ads/stage6- www.xxxx.com/xxxx/default/empty.gif/1?x" target="_top"><IMG SRC="https://cdn.oas-c17.adnxs.com/RealMedia/ads/Creatives/default/empty.gif/0" WIDTH=1 HEIGHT=1 ALT="" BORDER=0 BORDER="0"></A>
接下来,您可以使用jQuery将其转换为HTML节点,如下所示:
var a = $(markup[1]);
现在,您将拥有一个<a>
标记,您可以像对页面上的任何其他元素一样进行解析。您可以像这样检索href
和src
:
var href = a.attr('href');
var src = a.find('img').attr('src');
答案 1 :(得分:1)
如果您的字符串始终具有您提供的格式,则可以执行以下操作:
var nonFormattedCode = '<A HREF="xxxxxx/xxxx/xxx- www.xxxx.com/xxxx/default/empty.gif/1?x" target="_top"><IMG SRC="https://cdn.oas-c17.adnxs.com/RealMedia/ads/Creatives/default/empty.gif/0" WIDTH=1 HEIGHT=1 ALT="" BORDER=0 BORDER="0"></A>';
var href = nonFormattedCode.replace(/\s+/g,'').match(/HREF\=\"(.*)"target/)[1];
var src = nonFormattedCode.replace(/\s+/g,'').match(/SRC\=\"(.*)"WIDTH/)[1];
这很难看,但它确实起作用了。
答案 2 :(得分:1)
只要它的纯文本和您正在解析的内容完全采用该格式,您当然可以。
/*...*/
success: function(data) {
var href = data.match(/HREF="(.*?)"/)[1]; // https://xxxx-www.xxxx.com/xxx/home/1735871518/Right/default/empty.gif/1?x
var src = data.match(/SRC="(.*?)"/)[1]; // https://cdn.oas-c17.adnxs.com/RealMedia/ads/Creatives/default/empty.gif/0
}
/*...*/
如果您需要完整字符串,包括HREF=
部分,只需将[1]
替换为0即可。 String.match()
返回一个由完整匹配组成的数组,然后返回每个匹配的组,"(.*?)"
从字面上搜索从引号开始,到下一个结束的所有内容。
所以data.match(/HREF="(.*?)"/)
返回:
['HREF="http://www.url.com"', 'http://www.url.com']
答案 3 :(得分:1)
由于您似乎正在使用jQuery,为什么还要使用正则表达式呢?你可以从字符串中创建一个虚拟元素,如下所示:
var href = $element.attr('href');
var src = $element.children('img').first().attr('src');
然后,您可以抓住您想要的任何属性,就像您通常使用页面上的元素一样:
new
一种更安全的方法,恕我直言,因为它不依赖于要以非常具体的方式格式化的字符串,以便从正则表达式中获得干净的匹配。