返回来自字符串的10位联系人号码之前的子字符串


Return Sub String that comes before a 10 digit contact number from a String

嗨,我不能写一个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_CAPTUREPREG_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