2017-05-31 52 views
1

我试图从类似下面一行使用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

我不知道在哪里输出头和数字从何而来,但在这里是完全按照规定提取从单行输入链接文本的解决方案:

$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 |, '将输入行分成单独的元素。

  • -replace然后操作每个单独的<a>元件上:

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

至于你尝试过什么:

-match从未提取其输入部分 - 它返回一个布尔指示是否找到匹配与 LHS ,或者与阵列作为LHS匹配项目的过滤子阵列。

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

'(\>(.*?)\<)'包含两个与文字>相匹配的嵌套捕获组,后面跟着任意数量的字符(非贪婪地匹配),然后是文字<
这是捕获链接文本的捕获组。 不过:

  • 没有必要为捕获组。
  • >< do 不是需要\ - 在正则表达式中进行转义(尽管它没有任何伤害)。
+0

@YEMyslf:很高兴听到它;我的荣幸。 – mklement0