我想从文本(这是HTML文本)中获取字符串。
如何从下面的文本框中获取电子邮件地址(n.surname@examplemail.com)和正文(您的邮件已发送给以下收件人:)?
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p><b><font color="#000066" size="3" face="Arial">Your message has been delivered to the following recipients:</font></b></p>
<font color="#000000" size="2" face="Tahoma">
<p><a href="mailto:n.surname@examplemail.com">Name Surname(n.surname@examplemail.com)</a></p>
<p>Subject: test</p>
</font>
</body>
</html>
答案 0 :(得分:3)
假设您的HTML是有效的(粘贴的示例不是这样,如果它确实是从应用程序中获得的内容,则必须以某种方式进行更正)。
研究更正的示例(添加了<html>
标签,并根据this answer更正了<meta>
):
[xml]$html = @"
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p><b><font color="#000066" size="3" face="Arial">Your message has been delivered to the following recipients:</font></b></p>
<font color="#000000" size="2" face="Tahoma">
<p><a href="mailto:n.surname@examplemail.com">Name Surname(n.surname@examplemail.com)</a></p>
<p>Subject: test</p>
</font>
</body>
</html>
"@
注意:通常更喜欢像XML一样处理文本而不是字符串,因为您可以直接访问对象,所以这就是为什么我在一开始使用[xml]
对其进行转换的原因。
如果文件的结构在所有情况下都完全相同,则可以按以下方式访问提到的属性:
$body = $html.html.body.p.b.font.'#text'
$address = $html.html.body.font.p.a.href.replace('mailto:','')
或者,使用Select-Xml
:
$body = (Select-Xml -Xml $html -XPath '//font' | Where-Object {$_.Node.'#text'}).Node.'#text'
$address = (Select-Xml -Xml $html -XPath '//a').Node.href.replace('mailto:','')
您还可以使用以下脚本将文件的结构更正为有效的HTML:
$toBeCorrected = @"
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p><b><font color="#000066" size="3" face="Arial">Your message has been delivered to the following recipients:</font></b></p>
<font color="#000000" size="2" face="Tahoma">
<p><a href="mailto:n.surname@examplemail.com">Name Surname(n.surname@examplemail.com)</a></p>
<p>Subject: test</p>
</font>
</body>
</html>
"@
[xml]$correctHTML = '<html>' + ($toBeCorrected -replace '<meta (.*)>','<meta $1 />')