【问题标题】:regular expression to parse html title tag正则表达式解析html标题标签
【发布时间】:2011-04-12 14:53:06
【问题描述】:

我需要解析大量的 html 文件才能知道哪些文件包含标题标签中的特定文本。

假设标题是

file1.htm
<title>100 text other text</title>
file2.htm
<title>text 100 text other text</title>
file3.htm
<title>text 1000 text other text</title>
file4.htm
<title>text one hundred text other text</title>

按照我的示例,我需要找到包含 100 或 100 的文件名,即文件 1,2 和 4。

我的问题是我不会写正则表达式

gci "c:\my_folder" | ? {$_.extension -eq ".htm"} | 
select-string -pattern '<title>*100*</title>' |
Select-Object -Unique Path

请注意,如果这对正则表达式很重要,那么标题标签不是在行的开头而是在中间。 提前致谢。

【问题讨论】:

  • 通常情况下,使用正则表达式解析 HTML 是不好的。仅供参考。
  • 关于使用正则表达式解析 HTML 的强制性警告:stackoverflow.com/questions/1732348/…
  • 在这一点上稍微扩展一下:title 元素的内容可能会扩展到多行;它们可能包含其他 HTML 标记。由于其嵌套结构,HTML 标记通常不适合正则表达式处理。也许在这种情况下,您确切地知道您的输入文件是如何制作的,并且您知道标题总是在一行中,并且从不包含任何困难的东西。 IF 就是这样,那么正则表达式可能不是一个疯狂的方法。否则,你真的应该使用合适的解析器。
  • 感谢您的回复。我已经阅读了链接,但是如果它很糟糕并且我无法解析它们,我还有其他选择吗?编辑。现在我阅读了您的最后回复。
  • 我对 PowerShell 一无所知,但您应该尝试将模式中的 * 替换为 .*。 . 匹配任何字符。 * 的意思是“与我刚才所说的事情相匹配的任何事情”。所以.* 的意思是“任意数量的任意字符”。但是,我再说一遍,请仔细考虑正则表达式是否真的适合这项工作。

标签: regex powershell html-parsing


【解决方案1】:

应该这样做。

^.*<title>(.*(100|one\shundred)[^0].*)?</title>.*$

【讨论】:

  • 请问[^0]是什么意思?
  • 不允许1000,即100+0
  • @nick rulez,就像上面的评论所说,这将停止匹配 1000 表示不允许 0 作为下一个字符。
  • 啊,好的。现在我明白了。再次感谢您的好意。 :)
  • 这个解决方案 (^.*&lt;title&gt;(.*(100|one\shundred)[^0].*)?&lt;/title&gt;.*$) 过度使用了 greedy-dot-star! (它做了很多不必要的工作,尤其是在测试不匹配的长文件时。)并且不需要在 TITLE 元素之前或之后匹配任何内容。更好(也更快)的表达式是:&lt;title&gt;[^&lt;]*?\b(100|one\s+hundred)\b[^&lt;]*&lt;/title&gt;.
【解决方案2】:

试试

<title>(.*[^[:alnum:]])?(100|one hundred)([^[:alnum:]].*)?</title>

用于匹配的模式。模式语法是 PCRE(就像在 perl 中一样),如果需要,可以重新制定。

最好的问候,

卡斯滕

ps: 当心陷阱——来自 cmets 的所有建议和警告都成立;尽管如此,在您的情况下,正则表达式方法似乎是可行的(主要是因为您正在调查“标题”标签的内容,每个文件应该只有一个,并且将它分散到多行将是愚蠢的恕我直言)。

【讨论】:

  • 感谢 collapsar。甚至您的解决方案似乎也很完美。我也给了你一个赞成票,但我接受了 jimplode 的回答,因为他首先回答了。再次感谢。你是天才。恐怕我永远学不会这些正则表达式。 :(
  • 谢谢。但是请注意,您接受的解决方案也将匹配“百分之一”,这可能不是您想要的。问候,卡斯滕
  • 感谢您的警告。正如您所看到的,我完全是 regexp 的新手,所以我无法掌握这些小细节。 :) 我不会有“百分之一”的问题,因为我的母语是意大利语。为了让每个人都能理解,我把问题用英文表述了。我需要解析意大利字符串;)再次感谢。
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 2013-07-23
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多