我试图在特定字符和其他特定字符停止后获得值。这是我尝试过的
$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
)
)