2

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

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

我正在使用的测试代码是:

$string = "test ing ";
var_dump(preg_split('/t/', $string));

我希望得到一个如下所示的数组:

[0] => "es" [1] => " ing "

但正在返回以下内容:

[0] => "" [1] => "es" [2] => " ing "

为什么开头有一个空字符串?

我知道我可以使用PREG_SPLIT_NO_EMPTY标志来过滤它,但它不应该在那里开始。应该是?

4

3 回答 3

2

为什么不应该呢?这正是它的工作原理。操作的语义split是你有一个这种格式的字符串:

value-delimiter-value-delimiter-value-...-delimiter-value

(请注意,它是以一个值开始和结束,而不是分隔符。)

因此,如果您的字符串以定界符开头,那么假设在该定界符之前有一个空值是绝对有效的(因为定界符应该某些内容分成两部分)。您通常也不想拒绝两个连续ts 之间的空字符串,对吗?

这正是PREG_SPLIT_NO_EMPTY它的用途。每当您确实想摆脱那些空字符串时,您都可以使用它。

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

于 2012-10-29T20:06:04.870 回答
0

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

于 2012-10-29T20:06:27.500 回答
0

发生这种情况是因为t字符串的开头。如果您不使用该PREG_SPLIT_NO_EMPTY选项,preg_split则会将空字符串视为有效拆分。

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

对于某些应用程序,这将非常有用——例如,假设您想t用某些东西替换每个,但替换太复杂而无法使用preg_replace. 该语言希望您能够选择,因此除非您明确告诉它不要使用 with ,否则它会保留空拆分PREG_SPLIT_NO_EMPTY

于 2012-10-29T20:08:24.383 回答