Php 如何分解和修剪空白?
例如,我想从以下字符串中的元素创建一个数组:Php 如何分解和修剪空白?,php,explode,trim,higher-order-functions,Php,Explode,Trim,Higher Order Functions,例如,我想从以下字符串中的元素创建一个数组: $str = 'red, green, blue ,orange'; 我知道你可以通过它们爆炸和循环并修剪: $arr = explode(',', $str); foreach ($arr as $value) { $new_arr[] = trim($value); } 但我觉得有一种方法可以解决这个问题。有什么想法吗?您可以使用以下方法: 试试这个: $str = preg_replace("/\s*,\s*/",
$str = 'red, green, blue ,orange';
我知道你可以通过它们爆炸和循环并修剪:
$arr = explode(',', $str);
foreach ($arr as $value) {
$new_arr[] = trim($value);
}
但我觉得有一种方法可以解决这个问题。有什么想法吗?您可以使用以下方法: 试试这个:
$str = preg_replace("/\s*,\s*/", ",", 'red, green, blue ,orange');
你可以用它
$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);
/* Result:
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)
*/
以下内容还考虑了输入字符串开始/结束处的空格:
$new_arr = preg_split('/\s*,\s*/', trim($str));
这是一个最小的测试,在每个合理的位置都有空白:
$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
您也可以使用单行正则表达式来实现这一点
preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
修剪和爆炸
$str=‘红、绿、蓝、橙’
$str=修剪($str)
$strArray=爆炸(“,”,$str)
印刷费($strArray) 一个改进的答案
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange');
结果:
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
)
这个
- 仅以逗号分隔
- 修剪每个项目的空白
- 忽略空项
- 不拆分具有内部空格(如“green thing”)的项目
array (
0 => 'red',
1 => 'green',
2 => 'blue',
3 => 'orange',
)
array (
0 => 'Number1',
1 => '234',
2 => '0',
3 => '4heaven\'s-sake',
)
通过在character mask/3rd参数中添加必要的字符,也可以对字母以外的子字符串(以及一些连字符和撇号,如果您阅读了详细说明的话)进行调整
代码:()
输出:
array (
0 => 'red',
1 => 'green',
2 => 'blue',
3 => 'orange',
)
array (
0 => 'Number1',
1 => '234',
2 => '0',
3 => '4heaven\'s-sake',
)
同样,由于示例字符串,我将非常狭隘地处理这个问题,但这将提供相同的期望输出: 代码:()
通过结合我提出的现有答案中的一些原则
preg_split ('/\s*,+\s*/', 'red, green thing ,, ,, blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);
背后的原因是我在中发现了一个bug,如果字符串末尾有逗号,它将在数组中返回一个空白元素。i、 e
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange,');
导致
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
[4] => ''
)
您可以通过使用中提到的PREG\u SPLIT\u NO\u EMPTY删除它来解决此问题,但一旦这样做,从技术上讲,就不需要通过正则表达式删除连续的逗号,因此缩短的表达式就是如何在一行代码中替换和分解的
$str = 'red, green, blue ,orange';
$new_string = explode(',',preg_replace('/\s+/', '', $str));
将结果输出为
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)
这也是通过PHP@JasonOOO我认为在大多数人看来,几毫秒(如果是这样的话)是一个公平的折衷,因为有一行简短、简单、易读、易懂的代码。但是,如果处理大型数据集,@amr eladwy提供的更有效的答案是更好的解决方案。这将在元素中的空格上拆分将逗号移动到方括号的左侧,以使逗号成为必需的。将逗号移动到左侧无法解决此问题。请检查我的答案下面修剪做的比这更多。。。它修剪
\t\n\r\0\x0B
也不仅仅如此,但这会使元素的空格变大。这只会去除字符串开头和结尾的空格,而不是每种颜色之间的空格。由于数组\u map
和regexp解决方案产生相同的结果,有人能比较它们的性能吗?@Dan对于这种情况,这不会有什么区别。谁能解释一下为什么这个答案没有100票?Regexp很难理解,但它解析我的100Mb文件的速度比其他解决方案快。很抱歉,这个regex是错误的-尝试用*red*
替换red
。更好的方法可能是/(\s*,\s*)+/@amreladawi,仅供参考。8/28更新后,此方法不再有效。由于答案中的正则表达式是原样的,所以不会从某些元素中删除空白。例如:`绿色的东西'。嗨@Samsquanch,你能帮我更多关于更新的信息吗?“你们有小提琴手我可以玩吗?”Samsquanch更新。如果您发现任何问题,请告诉我。OP需要阵列preg_replace()
不会从字符串生成数组。这是对错误问题的正确答案。向下投票。$list=preg_split(“/\s*,\s*/”,“红、绿、蓝、橙”)代码>轻微修改可恢复答案
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
[4] => ''
)
$str = 'red, green, blue ,orange';
$new_string = explode(',',preg_replace('/\s+/', '', $str));
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)