2016-08-23 61 views
-2

我有一个this.responseText,这是混乱。试图分开我需要的那些:正则表达式的帮助 - 包括但不是显示

这里的文字:

<html> 
<head><title>Index of /browserify-view/build/source/pic/</title></head> 
<body bgcolor="white"> 
<h1>Index of /browserify-view/build/source/pic/</h1><hr><pre><a href="../">../</a> 
<a href="wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc.png">wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc..&gt;</a> 22-Jul-2016 22:29    65180 
<a href="thumb-wd20f381801bb51.png">thumb-wd20f381801bb51.png;</a> 22-Jul-2016 22:33    10779 
</pre><hr></body> 
</html> 

我怎么能分开是这样的:

wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc.png 

thumb-wd20f381801bb51.png 
+0

如果是,请添加javascript标记。 – revo

+0

^(?=。*(?: a href | .png | ...)) –

+0

a href =“(。*)。png –

回答

-1

首先相匹配,不要做到这一点与正则表达式!

Regex is NOT capable of parsing HTML


使用JavaScript DOMParser代替:

var parser = new DOMParser(); 
var doc = parser.parseFromString(this.responseText, 'text/html'); 

然后使用DOM API来获取你所需要的元素:

var nodes = doc.querySelectorAll('a:not([href="../"])'); 

最后,使用Array.map到节点映射到它们的href属性:

// Can't use nodes.map here because nodes in a NodeList, not an array 
var links = Array.prototype.map.call(nodes, function(element) 
{ 
    // Can't use element.href here because we're in a different document 
    return element.getAttribute('href'); 
}); 

如果你把它们放在一起:

var exampleResponseText = `<html> 
 
<head><title>Index of /browserify-view/build/source/pic/</title></head> 
 
<body bgcolor="white"> 
 
<h1>Index of /browserify-view/build/source/pic/</h1><hr><pre><a href="../">../</a> 
 
<a href="wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc.png">wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc..&gt;</a> 22-Jul-2016 22:29    65180 
 
<a href="thumb-wd20f381801bb51.png">thumb-wd20f381801bb51.png;</a> 22-Jul-2016 22:33    10779 
 
</pre><hr></body> 
 
</html>`; 
 

 
var parser = new DOMParser(); 
 
var doc = parser.parseFromString(exampleResponseText, 'text/html'); 
 
var nodes = doc.querySelectorAll('a:not([href="../"])'); 
 
var links = Array.prototype.map.call(nodes, function(element) 
 
{ 
 
    return element.getAttribute('href'); 
 
}); 
 

 
console.log(links);

+0

百万倍惊人。非常感谢Siguza! –

-1

你可以做

str.scan(/(?<=<a href=").+?\.png/) 

这将返回数组:

["wd0c9af04bbf54efc9a2f7ba766a6694f2421b1dc.png", "thumb-wd20f381801bb51.png"] 

要打破正则表达式

/(?<=<a href=").+?\.png/ 
  • (?<=<a href=")是一个积极的外观背后,其主要表达前<a href="字符串匹配,而不包括它的结果。

  • .+?匹配任何字符1次或更多次,使用懒惰运算符,匹配可能的最小字符数。

  • \.png.png

+1

[在HTML上使用正则表达式是一个不好的主意](https://stackoverflow.com/a/1732454)。 – Siguza

+0

这个问题是关于javascript –

+0

哦对不起,但正则表达式将工作在js。你可以看看这个[链接](http:// stackoverflow .com/questions/13895373/javascript-equivalent-of-rubys-stringscan)如何在javascript中实现'scan'方法。 – davidhu2000

0

这是目前为止我已经对这个话题见过的最好的回应之一: RegEx match open tags except XHTML self-contained tags

如果你想做一些快速,我会看起来像这样(蟒蛇):

<a[^>]+href="(?P<x>[^"]+)"> 

请注意,它的不好的做法,如果这将在更大规模(任何除了这个HTML以外)执行,我会推荐一个HTML解析器。从长远来看,这将节省大量时间。