0

使用 php 5.3 - ereg() 已弃用...

我正在尝试将此函数转换为(到 preg_match),但我不明白“指针”...

function gethostbyaddr_new($ip)
{
    $output = `host -W 1 $ip`;

    if (ereg('.*pointer ([A-Za-z0-9.-]+)\..*', $output, $regs))
    {
        return $regs[1];
    }

    return $ip;
}
4

3 回答 3

0

ereg 的第一个参数是正则表达式。因此,.*pointer匹配任何内容 ( .*),然后是单词“指针”( pointer),然后是表达式的其余部分。

于 2011-05-05T10:37:11.907 回答
0

真的不多。您需要做的就是在正则表达式字符串的开头和结尾添加一个标记字符。

通常,标记字符是斜杠 ( /),但也可以是其他字符(波浪号~非常常用,在这里很适合您),只要它在字符串的开头和结尾是相同的字符,并且不t 出现在字符串中(如果出现,您需要使用反斜杠对其进行转义)。

因此,您的代码可能如下所示:

preg_match('~.*pointer ([A-Za-z0-9.-]+)\..*~', $output, $regs)

请注意,如果您使用斜杠作为正则表达式标记字符,则需要将其加倍,因为斜杠也是 PHP 字符串中的转义字符。

在解释实际表达方面:

.*- 这是字符串开头的任意数量的任意字符(您实际上可以在此表达式中保留它;它不会影响匹配)

pointer- 这是在匹配的字符串中寻找实际的单词“指针”。

([A-Za-z0-9.-]+)- 查找一个或多个字母数字或点或连字符的字符。另外,因为这些都用括号括起来,所以它们成为一个“匹配组”,这意味着这部分搜索的结果以$regs[1].

\..*- 查找点字符,后跟任意数量的任意字符。与比赛开始时一样,.*可以删除它,因为它不会影响匹配。

所以整个表达式正在寻找一个看起来像这样的字符串:

blahblahblahpointer blah123-.blah.blahblahblah

然后,您将blah123-.blah进入$regs[1]

于 2011-05-05T10:37:52.990 回答
0

指针只是要匹配的一点文本

当我跑步时,host -W 1我得到
4.4.8.8.in-addr.arpa domain name pointer google-public-dns-b.google.com.

所以你可以使用:

function gethostbyaddr_new($ip)
{
    $output = `host -W 1 $ip`;

    if (preg_match('/.*pointer ([A-Za-z0-9.-]+)\..*/', $output, $regs))
    {
        return $regs[1];
    }

    return $ip;
}
于 2011-05-05T10:37:57.040 回答