嗨,我不能写一个PHP代码,返回所有的子字符串(正好在10位数之前)。
输入字符串为"8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com德里123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na"
期望输出:
substring 1 = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na "子字符串2 = "9560153352 jaggu jagdish@vedittechnologies.com德里123456 yes na yes 1 na "子字符串3 = "9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na"
preg_split()
很好,但很神秘。这里有一个替代的解决方案:
<?php
$input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";
// 1. Replaces all 10 digits preceded by an space by an carriage return.
$output = preg_replace('#'s('d{10})#', "'n$1", $input);
// 2. Stores the string by line by line in an array.
$output = explode("'n", $output);
// array (
// 0 => '8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na',
// 1 => '9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na',
// 2 => '9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na',
// )
var_export($output);
带选项PREG_SPLIT_DELIM_CAPTURE
的PHP函数preg_split
返回一个交替的10位数字、字符串等数组
$subject = '8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na';
$result = preg_split( '/('d{10})/', $subject ,'-1' , PREG_SPLIT_DELIM_CAPTURE);
array_shift($result);
for ( $ii = 0; $ii < count($result); $ii++ ) {
print $result[$ii] . $result[++$ii] . '<br>';
}
第一个元素为空,因此shift
关闭,然后循环通过数组打印对。这些可以保存到另一个数组或变量中,而不是在这里打印。
输出:
8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na
9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na
9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na
如果您想要完全相同的输出,您可以使用如下命令:
$input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";
$splited = preg_split('~('d{10})~', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
$lines = array_map(function($item) use ($input) {
return substr($input, $item[1] - 10, 10) . $item[0];
}, $splited);
var_dump($lines);
如果您想创建一个关联数组,这可能是一个更好的输出,这将有助于:
$input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";
$splited = preg_split('~('d{10})~', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$i = 0;
$lines = array_reduce($splited, function($carry, $item) use (&$i) {
++$i % 2 ? array_push($carry, $item) : $carry[array_pop($carry)] = $item;
return $carry;
}, array());
var_dump($lines);
我认为你可以很容易地解决这个问题,使用PHP函数拆分正则表达式,preg-split模式/[0-9]{10}/
:
<?php
$subject = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";
$pattern = '/([0-9]{10})/';
$val = preg_split ( $pattern , $subject, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
for ($i=0; $i < count($val); $i+=2){
print($val[$i].$val[$i+1]);
}
?>
您首先通过preg_split
拆分单片字符串,将10位数字的任何组合作为分隔符。请注意,我们在这里使用选项PREG_SPLIT_DELIM_CAPTURE
和PREG_SPLIT_NO_EMPTY
来捕获数字,根据您的需求。
那么你有一个数组组织如下:
[0] => first delimiter // your number
[1] => what follows
[2] => second delimiter // your second number
[3] => what follows
...
您只需要按照您喜欢的方式合并结果数组(我使用了一个愚蠢的for循环,您可以找到一个更好的PHP-nic方式来完成它)。结果将如下所示,如您所愿:
8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na
9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na
9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na