使用Powershell提取锚标记链接文本

时间:2017-05-31 02:01:15

标签: powershell

我正在尝试使用PowerShell从下面的行中提取链接文本。

<a href="javascript:showPopupWindow('catdesc.jsp?catnum=20')">Entertainment</a>, <a href="javascript:showPopupWindow('catdesc.jsp?catnum=5')">Intimate Apparel/Swimsuit</a>, and <a href="javascript:showPopupWindow('catdesc.jsp?catnum=92')">Suspicious</a>

我尝试了以下内容,但它仅匹配第一个结果,并且包含我不想要的><。我确定这是正则表达式的一个问题,但我不太清楚它看错了什么。请注意,上面的字符串是$result.categorization

$result.categorization -match '(\>(.*?)\<)'

返回

Name,Value
2,Entertainment                                                                            
1,>Entertainment<
0,>Entertainment<

我想返回

Name,Value
2,Suspicious                                                                            
1,Intimate Apparel/Swimsuit
0,Entertainment

我还尝试了列出的正则表达式Regular expression to extract link text from anchor tag,但这与任何内容都不匹配。

1 个答案:

答案 0 :(得分:1)

我不知道输出中的标题和数字来自哪里,但是这里是一个解决方案,它完全按照指定的方式从单行输入中提取链接文本:

$str = @'
<a href="javascript:showPopupWindow('catdesc.jsp?catnum=20')">Entertainment</a>, <a href="javascript:showPopupWindow('catdesc.jsp?catnum=5')">Intimate Apparel/Swimsuit</a>, and <a href="javascript:showPopupWindow('catdesc.jsp?catnum=92')">Suspicious</a>
'@

$str -split ', and |, ' -replace '.*?>([^<]*).*', '$1' 
  • $str -split ', and |, '将输入行拆分为单独的<a>元素。

  • -replace然后分别对每个<a>元素进行操作:

    • '.*?>([^<]*).*'整个行匹配,但仅捕获唯一捕获组(...)中的链接文本。
    • 替换文本$1然后用捕获组匹配的内容替换整行,即实际上只返回链接文本。

至于你的尝试:

-match从不提取其输入的部分 - 它会返回 Boolean ,指示是否找到与标量 LHS匹配的内容,或带有数组作为LHS的匹配项的过滤子数组。

也就是说,自动$Matches变量确实包含有关哪些部分匹配的信息,但仅包含标量 LHS的信息。

'(\>(.*?)\<)'包含两个嵌套的捕获组,它们与文字>匹配,后跟任意数量的字符(非贪婪匹配),后跟文字<内部捕获组将捕获链接文本。 但是:

  • 不需要外部捕获组。
  • ><需要\ - 在正则表达式中转义(虽然没有任何损害)。