正则表达式删除<a href>标签,但保留网址</href>

时间:2012-07-23 16:59:41

标签: regex

如果有人可以帮助我非常感激,那就是正则表达式的垃圾。

它会变得有点像我想象的那样 - 所以我的帽子也可以解决它的任何人!

所以说我们的文件包含以下格式的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

任何一位大师能想出这个吗?我更喜欢一个正则表达式来处理这两种情况,但两个单独的情况也可以。

提前致谢/

2 个答案:

答案 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,我希望这个例子有意义。我在给定的输入文件上测试了它,它产生了预期的输出。