获取特定字符之后的值,并在其他特定字符上停止


Getting values after a specific character and stopping on other specific characters regex

我试图在特定字符和其他特定字符停止后获得值。这是我尝试过的

$whois = 'Registrant Name: Domain Administrator Registrant Organization: Yahoo! Inc. Registrant Street: 701 First Avenue Registrant City: Sunnyvale';
$data = preg_match_all('/:'s(.*?)'s/', $whois, $data_whois);
var_dump($data_whois[1]);

whois for yahoo: http://whois.domaintools.com/yahoo.com

电流输出

  1 => string 'Domain' (length=6)
  2 => string 'Yahoo!' (length=6)
  3 => string '701' (length=3)
  4 => string 'Sunnyvale' (length=9)
预期输出

  1 => string 'Domain Administrator' (length=6)
  2 => string 'Yahoo! Inc.' (length=6)
  3 => string '701 First Avenue' (length=3)
  4 => string 'Sunnyvale' (length=9)

但是它只取第一个单词。我相信这是因为(.*?)'s,我也尝试了(.*?'s.*?)'s,它接受第二个单词,但如果值没有第二个单词将接受单词Registrant,所以我需要停止注册,但不明白到底是怎么回事。

由于您使用的是惰性量词.*?,然后是's,因此匹配将在第一个空白字符处停止。

解决这个问题的一种方法是使用.*?必须后跟一个空格和单词"Registrant"或字符串末尾的事实:

/:'s(.*?)(?:'sRegistrant'b|'s*$)/

另一种可能的方法是使用preg_split:

$str = 'Registrant Name: Domain Administrator Registrant Organization: Yahoo! Inc. Registrant Street: 701 First Avenue Registrant City: Sunnyvale';
$pattern = '~'s*'bRegistrant[^:]+:'s*~';
$result = preg_split($pattern, $str, -1, PREG_SPLIT_NO_EMPTY);

看起来您的字段恰好有两个单词,后跟第二个单词的:。如果是,那么你可以尝试下面的正则表达式。

: 'K.*?(?= 'S+ 'S+:|$)

演示

PHP代码应该是,

<?php
$data = 'Registrant Name: Domain Administrator Registrant Organization: Yahoo! Inc. Registrant Street: 701 First Avenue Registrant City: Sunnyvale';
$regex =  '~: 'K.*?(?= 'S+ 'S+:|$)~';
preg_match_all($regex, $data, $matches);
print_r($matches);
?>
输出:

Array
(
    [0] => Array
        (
            [0] => Domain Administrator
            [1] => Yahoo! Inc.
            [2] => 701 First Avenue
            [3] => Sunnyvale
        )
)