我有这个字符串。
130003 lebtro is cool 609664 trochanter2 460936 bibi95 410635 MrRadical38 206311 Labonte 577767 thebanzaikid 569248 marco 355894 Armored_J 630259 SNEG323 569014 llama 501235 plummer 305212 lonefish 294268 dragonbleed 399281 Stelomat 619909 McPred 22733 Storykeeper 634691 The Max 504980 MrFrench 248285 Darkshadow2013 647361 Cain
我希望能够解析数字,然后是这样的字母:
130003 lebtro is cool<br>
609664 trochanter2<br>
460936 bibi95<br>
410635 MrRadical38<br>
206311 Labonte<br>
...<br>
...<br>
...<br>
647361 Cain
我是否需要在PHP中使用RegEx,还是有其他方法可以做到这一点?
答案 0 :(得分:1)
使用preg_split:
$result = preg_split('~\s*\b(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY);
或更多防水:
$result = preg_split('~(?:\s|\A)\s*(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY);
或为什么不模式:
$result = preg_split('~(?:\s+|\A\s*)(*SKIP)(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY);
没有正则表达式:
$elts = explode(' ', $str);
$result = array();
$tmp = '';
foreach ($elts as $elt) {
if (ctype_digit($elt)) {
if ($tmp) $result[] = $tmp;
$tmp = $elt;
} else
$tmp .= ' ' . $elt;
}
$result[] = $tmp;
答案 1 :(得分:1)
这是一个正则表达式解决方案:
\b(\d+)\s+(.+?(?=\s+\d|$))
您可以将其与preg_match_all
一起使用。每个匹配将包含第一组中的数字和第二组中的值。
这样的事情应该可以胜任:
preg_match_all('#\b(\d+)\s+(.+?(?=\s+\d|$))#', $input, $matches, PREG_SET_ORDER);
// $matches[0][1] == "130003"
// $matches[0][2] == "lebtro is cool"
// $matches[1][1] == "609664"
// $matches[2][2] == "trochanter2"
使用此解决方案,任何以空格分隔的数字都被视为入口开头。如果您的所有数字都是6位数字,请将\d+
替换为\d{6}
(或\d{6,}
替换为至少6位数。