这是我的字符串
#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;
}
}
答案 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 demo和regex demo。
模式详情:
\s*
- 0+ whitespaces #
- 文字#
符号[^:]+
以匹配:
:
- 冒号\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]+
这符合您所需的输出,其中包含words
和spaces
。
解决方案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_map
和explode
来实现所需的目标。我们首先在exploding
上#
字符串,然后在:
上展开其数组值并在结果数组中推送其first
索引。
解决方案2:
<?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]);
}