Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何分解和修剪空白?_Php_Explode_Trim_Higher Order Functions - Fatal编程技术网

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”)的项目

特别是对于OP的示例字符串,因为要匹配的每个子字符串都是一个单词,所以可以使用

代码:()

输出:

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
)