0

我有一段我提取的 html 代码:

Server Address</span></td><td    ><span  class="hpPageText" >hostname0403.domain.tld</span></td><

从这个字符串中,我试图提取 fqdn (hostname0403.domain.tld)。我想我会使用以下逻辑:

  1. 以 > 开头,以 < 结尾
  2. 必须至少包含 1 个句点(点)。
  3. 必须包括所有数字、所有字母或两者的组合。

我希望最终得到的是“>hostname0403.domain.tld<”,从那里我可以去掉><。这是我到目前为止的注册,它有效,但我认为它不准确:

$reg = ">[\w\.]+<"

我对正则表达式很陌生,虽然这确实有效,但我不确定它是否安全。任何帮助,将不胜感激。

4

2 回答 2

1

您可以使用以下内容(作为奖励,Regex 为您排除了 > 和 <):

        string source = @"Server Address</span></td><td    ><span  class=""hpPageText"" >hostname0403.domain.tld</span></td><";
        Regex r = new Regex(@"(?<=\>)(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?=\<)");

        string fqdn = "";
        Match fqdnMatch = r.Match(source);
        if (fqdnMatch.Success)
        {
            fqdn = fqdnMatch.Value;
        }
于 2013-01-17T16:25:26.650 回答
1

正则表达式模式需要一些工作。例如,主机名之前和/或之后可能有空格。主机名可以包含“-”字符。您可以像这样处理空格:

'>\s*(..hostname regex)\s*<'

有关更好的主机名正则表达式,请参阅此SO答案。以下是您将如何修改该正则表达式以满足您的需求:

$str = 'Server Address</span></td><td    ><span  class="hpPageText" >hostname0403.domain.tld</span></td><'
$ValidHostnameRegex = ">\s*((?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))\s*<"
$str -match $ValidHostnameRegex
$matches[1]

输出:

hostname-0403.domain.tld
于 2013-01-17T16:13:58.107 回答