如何在php中从字符串生成数组

时间:2017-05-05 11:33:31

标签: php regex

这是我的字符串

#Jhon:经理#Mac:项目经理#Az:所有者

我想要像这样的数组

$array = ['0' => 'Manager', '1' => 'Project Manager', '2' => 'Owner']

我试过这个,但每次只返回'经理'

$string = '#Jhon: Manager #Mac: Project Manager #Az: Owner';
getText($string, ':', ' #')
public function getText($string, $start, $end)
{
  $pattern = sprintf(
      '/%s(.+?)%s/ims',
      preg_quote($start, '/'), preg_quote($end, '/')
  );

  if (preg_match($pattern, $string, $matches)) {
      list(, $match) = $matches;
      echo $match;
  }
} 

4 个答案:

答案 0 :(得分:8)

您可以preg_split内容并使用以下解决方案:

$re = '/\s*#[^:]+:\s*/';
$str = '#Jhon: Manager #Mac: Project Manager #Az: Owner';
$res = preg_split($re, $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($res);

请参阅PHP demoregex demo

模式详情

  • \s* - 0+ whitespaces
  • # - 文字#符号
  • [^:]+以匹配:
  • 以外的1个字符
  • : - 冒号
  • \s* - 0+空格。

请注意preg_split function中的-1$limit参数,告诉PHP分割任意次数(如有必要),PREG_SPLIT_NO_EMPTY将丢弃所有空匹配(此如果你需要保持空的匹配,可以删除一个,这取决于你需要做什么进一步)。

答案 1 :(得分:6)

这里我们使用preg_match来实现所需的输出。

正则表达式: #\w+\s*\:\s*\K[\w\s]+

  

1。 #\w+\s*\:\s*\K这将匹配#然后words然后spaces,然后: \K将匹配重置当前匹配。

     

2. [\w\s]+这符合您所需的输出,其中包含wordsspaces

解决方案1:

<?php
ini_set('display_errors', 1);
$string="#Jhon: Manager #Mac: Project Manager #Az: Owner";
preg_match_all("/#\w+\s*\:\s*\K[\w\s]+/", $string,$matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => Manager 
            [1] => Project Manager 
            [2] => Owner
        )

)

<小时/> 在这里,我们使用array_mapexplode来实现所需的目标。我们首先在exploding#字符串,然后在:上展开其数组值并在结果数组中推送其first索引。

解决方案2:

Try this code snippet here

<?php

$string="#Jhon: Manager #Mac: Project Manager #Az: Owner";
$result=  array_map(function($value){
    return trim(explode(":",$value)[1]);
}, array_filter(explode("#", $string)));
print_r(array_filter($result));

<强>输出:

Array
(
    [1] => Manager
    [2] => Project Manager
    [3] => Owner
)

答案 2 :(得分:0)

您可以使用explode()函数按字符串拆分字符串。之后,只需用preg_replace()替换新数组的元素。

答案 3 :(得分:0)

试试这个

$string = '#Jhon: Manager #Mac: Project Manager #Az: Owner';
$res = explode("#", $string);
$result = array();
for($i = 1; $i < count($res); $i++)  {
    $result[] = preg_replace("/(^[A-Z][a-z]*: )/", "", $res[$i]);
}