2013-02-21 69 views
0

我有一个文件,有很多重复的块这样的无法比拟的正则表达式

<li> 
<span>תמונה מאירוע</span> 
<a href="images/gallerys/events/big/109.jpg" 
title="תמונה מאירוע"><img 
src="images/gallerys/events/thumbnails/109.jpg" alt="cars" /> 
</a> 
</li> 

我想找到对图像的URL和拇指的URL文本 我的模式是:

href='(.*)'(.*)title(.*)src='(.*?)' 

问题是从第一个href到最后一个src返回给我的文本

+0

你使用什么语言? – 2013-02-21 21:11:20

+0

使你的捕获组不贪心:'(。*)' - >'(。*?)'。只是解析HTML。这会更容易。 – Blender 2013-02-21 21:13:31

回答

0

Javascript实现

var m, 
    pairs = [], 
    rex = /<li>[\s\S]*?<a href="([^"]+)"[\s\S]+?<img\s+src="([^"]+)"/g, 
    str = '<li>\n' + 
      '<span>תמונה מאירוע</span>\n' + 
      '<a href="images/gallerys/events/big/109.jpg"\n' + 
      'title="תמונה מאירוע"><img\n' + 
      'src="images/gallerys/events/thumbnails/109.jpg" alt="cars" />\n' + 
      '</a>\n' + 
      '</li>'; 

while (m = rex.exec(str)) { 
    pairs.push([ m[1], m[2] ]); 
} 

console.log(pairs); 

假设网址中没有报价。

使用合适的HTML解析器会更可靠。

+0

工程就像一个魅力!谢谢 – user2097124 2013-02-22 07:34:45

1

在你的例子中没有'。在这种情况下,title属性是换行的,所以你永远无法正确匹配。这些只是一些例子,但还有很多需要解决的问题,并且使用纯正则表达式无法做到这一点。无论您使用哪种语言(除了bash/sed/awk ...家族),它都将支持将HTML解析为DOM树,并且您可以轻松找到所需的节点。

注意:正如其他人指出的,其中一个问题是.*是贪婪的,这意味着它会尽可能多地吃掉我们的字符。如果你真的很固执,你可以用一个非贪婪版本.*?或像[^"']*这样的字符集匹配来解决这个问题。

+0

有可能SO包裹了字符串,但是,我认为大多数正则表达式引擎都有一个多行标志? /米? – AndrewP 2013-02-21 21:30:18