[regexp] How to extract...

J

Jan Kowalski

From:

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}

i need each occurence of text enclosed between url(************), for
this example:

images/wordpress-logo.png
images/download-tab-bg.png
 
7

7stud --

Jan said:
From:

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}

i need each occurence of text enclosed between url(************), for
this example:

images/wordpress-logo.png
images/download-tab-bg.png

str = <<CSS
#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}
CSS

pattern = /url\((.*)\)/ #to match a parenthesis escape it with a '\'

str.each do |line|
match = line[pattern, 1] #1 is the parenthesized sub pattern
if match
puts match
end
end

--output:--
images/wordpress-logo.png
images/download-tab-bg.png
 
7

7stud --

7stud said:
pattern = /url\((.*)\)/ #to match a parenthesis escape it with a '\'

Actually, to be safe make the .* non-greedy:

pattern = /url\((.*?)\)/ #to match a parenthesis escape it with a '\'

Here's the difference:

str = "abcurl(good)bad)xyz"

pattern1 = /url\((.*)\)/ #to match a parenthesis escape it with a '\'
pattern2 = /url\((.*?)\)/ #to match a parenthesis escape it with a '\'


match1 = str[pattern1, 1] #1 is the parenthesized sub pattern
puts match1

match2 = str[pattern2, 1] #1 is the parenthesized sub pattern
puts match2

--output:--
good)bad
good
 
T

Todd Benson

Jan said:
From:

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}

i need each occurence of text enclosed between url(************), for
this example:

images/wordpress-logo.png
images/download-tab-bg.png

str = <<CSS

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}
CSS

pattern = /url\((.*)\)/ #to match a parenthesis escape it with a '\'

str.each do |line|
match = line[pattern, 1] #1 is the parenthesized sub pattern
if match
puts match
end
end

--output:--


images/wordpress-logo.png
images/download-tab-bg.png

You can use a non-greedy multi-line #scan pattern as well...

str.scan /url\((.*?)\)/m
=> [["images/wordpress-logo.png"], [images/download-tab-bg.png]]

...which you can #flatten if you want.

Todd
 
R

Robert Klemme

Jan said:
From:

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}

i need each occurence of text enclosed between url(************), for
this example:

images/wordpress-logo.png
images/download-tab-bg.png

str = <<CSS

#header h1 a {
display: block;
background: url(images/wordpress-logo.png) center left no-repeat;
width: 301px;
height: 88px;
text-indent: -9999px;
float: left;
}

#header ul li#download a {
background: #d54e21 url(images/download-tab-bg.png) bottom left
repeat-x;
color: #fff;
-moz-border-radius-topleft: 3px;
-khtml-border-top-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-topright: 3px;
-khtml-border-top-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
text-shadow: #b5421c 1px 1px 1px;
}
CSS

pattern = /url\((.*)\)/ #to match a parenthesis escape it with a '\'

str.each do |line|
match = line[pattern, 1] #1 is the parenthesized sub pattern
if match
puts match
end
end

--output:--


images/wordpress-logo.png
images/download-tab-bg.png

You can use a non-greedy multi-line #scan pattern as well...

str.scan /url\((.*?)\)/m
=> [["images/wordpress-logo.png"], [images/download-tab-bg.png]]

..which you can #flatten if you want.

I'd rather use a more specific match as I believe this could be a tad
more efficient

str.scan /url\(([^)]*)\)/m

Cheers

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top