我正在尝试用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
标志来过滤它,但它不应该在那里开始。应该吗?
答案 0 :(得分:2)
为什么不应该呢?这正是它的工作原理。 split
操作的语义是您有一个这种格式的字符串:
value-delimiter-value-delimiter-value-...-delimiter-value
(请注意,它以值开头和结尾,而不是分隔符。)
因此,如果你的字符串以分隔符开头,那么假定在该分隔符之前有一个空值是绝对有效的(因为分隔符应该分割某些东西为两个)。您通常也不想拒绝两个连续t
之间的空字符串,是吗?
这正是PREG_SPLIT_NO_EMPTY
的用途。只要你做想要摆脱那些空字符串就可以使用它。
作为一个简单的例子,您可以想要默认行为,只需考虑CSV文件。您想在(例如);
分割一行。您通常还希望允许空值。现在,如果第一列中的值为空(意味着该行将以<{1}}开始,并且您将第一个空字符串完全切掉,那么结果数组中的所有索引都会突然对应这就是为什么你想保留那些空字符串的原因。在很多情况下,你知道有多少分隔符,因此有多少值 - 你希望能够识别哪个值属于哪个位置。甚至如果其中一些是空的。
答案 1 :(得分:0)
它正常工作100%。第一个字符是't',因此它首先分裂为't'。在第一个't'之前没有任何内容,因此数组结果以空字符串条目开头。
答案 2 :(得分:0)
由于字符串开头的t
而发生这种情况。如果您不使用PREG_SPLIT_NO_EMPTY
选项,preg_split
会将空字符串视为有效拆分。
以这种方式思考:到处都preg_split
看到t
,它将字符串切成两个块:t
之前的块,以及之后的块。即使其中一个块没有任何内容,它仍然很重要。那件作品只是一个空字符串。
对于某些应用程序,这将非常有用 - 例如,假设您想要用某些内容替换每个t
,但替换太复杂而无法使用preg_replace
。该语言希望您能够选择,因此除非您明确告诉它不要使用PREG_SPLIT_NO_EMPTY
,否则它会保留空分割。