正则表达式帮助解析绑定文件

时间:2016-07-09 02:02:24

标签: php regex

我正在尝试从绑定区域文件中解析当前添加的域...

示例字符串

net.    86400   in  rrsig   nsec    5   1   86400    
test-name.net.  86400   in  rrsig   nsec
testname.net.   86400   in  rrsig   nsec

我试过跟随正则表达式...

preg_match_all("/(\S+)\.\s+86400\s+in\s+rrsig/", $str, $matches);

返回

Array
(
    [0] => Array
        (
            [0] => net. 86400   in  rrsig
            [1] => test-name.net.   86400   in  rrsig
            [2] => testname.net.    86400   in  rrsig
        )

    [1] => Array
        (
            [0] => net
            [1] => test-name.net
            [2] => testname.net
        )

)

它应该只返回以.net tld结尾的域。

1 个答案:

答案 0 :(得分:0)

您还没有明确说明您想要的是什么,但您可以尝试以下方法。

preg_match_all("/\S+\.(?:net|tld)/", $str, $matches);

结果

Array
(
    [0] => Array
        (
            [0] => test-name.net
            [1] => testname.net
        )

)

或者

$pattern = "/\S+\.(?:net|tld)\.(?:\t|\s)+86400(?:\t|\s)+in(?:\t|\s)+rrsig/";
preg_match_all($pattern, $str, $matches);

结果

Array
(
    [0] => Array
        (
            [0] => test-name.net.  86400   in  rrsig
            [1] => testname.net.   86400   in  rrsig
        )

)

两个示例中使用的:?使得该组不会被捕获,只匹配()中的内容。这会降低preg_match_all的结果,因此您不需要通过数组来获得所需内容。

修改

您可以使用向前看(?=)来确保所有必需的内容都在那里,然后只选择您想要的部分。

$pattern = 
    "/(?=\S+\.(?:net|tld)\.(?:\t|\s)+86400(?:\t|\s)+in(?:\t|\s)+rrsig)\S+\.(?:net|tld)/"
    ;
preg_match_all($pattern, $str, $matches);

在示例中,所需内容为:

(?=\S+\.(?:net|tld)\.(?:\t|\s)+86400(?:\t|\s)+in(?:\t|\s)+rrsig)

,所需内容为:

\S+\.(?:net|tld)