首页 > 解决方案 > 如何在文本中获取指定的字符串

问题描述

我想从文本中获取一个字符串(它是一个 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>

标签: powershell

解决方案


假设您的 HTML 是有效的(您粘贴的示例并非如此,如果它正是您从应用程序中获得的内容,您将不得不以某种方式更正它)。

处理更正的示例(添加<html>标签,<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 />')

推荐阅读