如何使用指向preg_match()的指针将弃用的ereg()转换为

时间:2011-05-05 10:25:38

标签: php ereg

使用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;
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

通常标记字符是斜线(/),但它可以是其他字符(代字号~非常常用,并且在这里适合你),只要它是相同的字符串的开头和结尾处的字符,并且不会出现在字符串中(如果有的话,您需要使用反斜杠转义它。)

所以你的代码看起来像这样:

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

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

在解释实际表达方面:

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

pointer - 这是在匹配的字符串中查找实际的单词'pointer'。

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

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

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

blahblahblahpointer blah123-.blah.blahblahblah

然后,您将在blah123-.blah中获得$regs[1]

答案 2 :(得分: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;
}