所以说我们的文件包含以下格式的2个html标签:
abc1234
<a href="http://google.com">Some Text</a> <P>
<a href="http://www.google.com" rel="nofollow">Some Text</a>
abc1234
我试图删除除url之外的所有标签中的所有内容(并保留其他文本),因此本文档中正则表达式的输出将为
abc1234
http://google.com <P>
http://www.google.com
abc1234
任何一位大师能想出这个吗?我更喜欢一个正则表达式来处理这两种情况,但两个单独的情况也可以。
提前致谢/
答案 0 :(得分:2)
ScottStevens,众所周知,尝试使用正则表达式解析html很困难,事实上,在这个问题上有很多verbose post。但是,如果这些是<a>
所采用的唯一两种格式,则可以采用以下方法解决问题:
关于如何处理此问题的第一个线索是,这两个标记都以<a href="
开头,您希望将其取出,为此,'<a href="'
上的简单删除即可,没有正则表达式必需的。
您的下一个线索是,有时,您的结束标记有时会">...</a>
,有时会" rel=...</a>
(在rel =之间,从正则表达式的角度来看无关紧要)。现在注意" rel="...</a>
在">...</a>
的某个地方包含" rel="...</a>
。这意味着您可以分两步删除" rel="...
,将">
移至">...</a>
,然后移除<a...>...</a>
。此外,要确保仅在...
的一个标记之间删除,请在">...</a>
的{{1}}中添加其他约束,但不能有<a
。
那和regex cheat sheet可以帮助你开始。
那就是说,你应该使用html解析器。 Robust and Mature HTML Parser for PHP
答案 1 :(得分:1)
我是一名Rubyist,所以我的例子将是Ruby。我建议使用两个正则表达式,只是为了保持正确:
url_reg = /<a href="(.*?)"/ # Matches first string within <a href=""> tag
tag_reg = /(<a href=.*?a>)/ # Matches entire <a href>...</a> tag
您需要将带有第一个正则表达式的URL拉出并临时存储,然后用存储的URL替换标记的全部内容(与tag_reg匹配)。
您可以将它组合起来,但这似乎不是一个好主意。您从根本上改变(通过删除)原始标记,并将其替换为内部的内容。如果你尽可能地分开这两个步骤,那么事情出错的可能性会更小。
Ruby中的示例
def replace_tag(input)
url_reg = /<a href="(.*?)"/ # Match URLS within an <a href> tag
tag_reg = /(<a href=.*?a>)/ # Match an entire <a href></a> tag
while (input =~ tag_reg) # While the input has matching <a href> tags
url = input.scan(url_reg).flatten[0] # Retrieve the first URL match
input = input.sub(tag_reg, url) # Replace first tag contents with URL
end
return input
end
File.open("test.html", "r") do |html_input| # Open original HTML file
File.open("output.html", "w") do |html_output| # Open an output file
while line = html_input.gets # Read each line
output = replace_tag(line) # Perform necessary substitutions
html_output.puts(output) # Write output lines to file
end
end
end
即使你不使用Ruby,我希望这个例子有意义。我在给定的输入文件上测试了它,它产生了预期的输出。