如何从ajax返回的纯文本中提取href和src结果

时间:2017-02-21 14:14:01

标签: javascript jquery regex

我必须使用一个完全没有写好的小部件。所以它使用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重新获得所有内容,所以我很难解析这个纯文本。它是通过正则表达式来实现的吗?

4 个答案:

答案 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>标记,您可以像对页面上的任何其他元素一样进行解析。您可以像这样检索hrefsrc

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

一种更安全的方法,恕我直言,因为它不依赖于要以非常具体的方式格式化的字符串,以便从正则表达式中获得干净的匹配。