Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 preg_分割结果不正确_Php_Regex_Preg Split - Fatal编程技术网

PHP preg_分割结果不正确

PHP preg_分割结果不正确,php,regex,preg-split,Php,Regex,Preg Split,我正在尝试学习PHP中的正则表达式,并尝试使用preg_split函数 但这似乎不正确,或者我的理解完全错误 我使用的测试代码是: $string = "test ing "; var_dump(preg_split('/t/', $string)); 我希望得到如下所示的数组: [0] => "es" [1] => " ing " 但以下内容正在被退回: [0] => "" [1] => "es" [2] => " ing " 为什么开头有一个空字符串 我知

我正在尝试学习PHP中的正则表达式,并尝试使用preg_split函数

但这似乎不正确,或者我的理解完全错误

我使用的测试代码是:

$string = "test ing ";
var_dump(preg_split('/t/', $string));
我希望得到如下所示的数组:

[0] => "es" [1] => " ing "
但以下内容正在被退回:

[0] => "" [1] => "es" [2] => " ing "
为什么开头有一个空字符串


我知道我可以使用
PREG\u SPLIT\u NO\u EMPTY
标志来过滤此内容,但它不应该一开始就存在。应该吗?

为什么不应该?这就是它的工作原理。
split
操作的语义是您拥有以下格式的字符串:

value-delimiter-value-delimiter-value-...-delimiter-value
(请注意,它是以值而不是分隔符开始和结束的。)

因此,如果字符串以分隔符开头,则假定该分隔符前面有一个空值是绝对有效的(因为分隔符应该将某物一分为二)。您通常也不想拒绝两个连续的
t
s之间的空字符串,是吗

这正是
PREG\u SPLIT\u NO\u EMPTY
的作用。只要确实想要清除那些空字符串,就可以使用它


作为一个简单的示例,您为什么需要默认行为,只需考虑CSV文件。您想在(例如)
处拆分一行。您通常还希望允许空值。现在,如果第一列中的值为空(这意味着该行将以
开头,您将第一个空字符串完全切掉,然后结果数组中的所有索引突然将对应于不同的列。这就是为什么您希望保留这些空字符串的原因。在许多情况下,您知道有多少分隔符,因此也知道有多少值-并且您希望o能够识别哪个值属于哪个位置。即使其中一些值是空的。

它工作100%正确。第一个字符是't',因此它首先在't'上拆分。在第一个't'之前没有任何内容,因此数组结果以空字符串条目开始。

这是因为字符串的开头。如果不使用
PREG\u SPLIT\u NO\u EMPTY
选项,
PREG\u SPLIT
将空字符串视为有效分割

可以这样想:在
preg_split
看到一个
t
的任何地方,它都会将字符串分为两个块:
t
之前的块和之后的块。即使其中一个块中没有任何内容,它仍然很重要。该块只是一个空字符串


对于某些应用程序,这将非常有用——例如,假设您想用某物替换每个
t
,但替换太复杂,无法仅使用
preg\u replace
。该语言希望您能够选择,因此它保留空分割,除非您明确告诉它不要使用
preg\u split\u NO_空的

好的,这就是我的理解有缺陷的地方。它拆分并查看拆分点的后面。