如何使用preg_split分割字符串且不丢失字符?
解决preg_split分割时丢失单词首字符的问题
你遇到的问题根源在于正则表达式/;\w/的匹配逻辑:它会把分号+紧跟的单词字符(比如示例里的;H)整个作为分隔符,而preg_split会直接移除匹配到的分隔符内容,所以H就跟着分号一起被删掉了,才会出现Hey变成ey的情况。
要避免丢失后续的单词字符,我们需要用零宽断言来精准定位分割位置,同时不消耗后面的单词字符,有两种方案可选:
方案1:移除分号,仅在分号后紧跟单词时分割
如果你希望分割后分号被去掉,得到["Hello; how are you", "Hey, I am fine"]这种结果,使用带正向先行断言的正则:
$string = "Hello; how are you;Hey, I am fine"; $new = preg_split("/;(?=\w)/", $string); print_r($new);
这里的(?=\w)是正向先行断言,它只会检查分号后面是否紧跟单词字符,但不会把这个单词字符包含在匹配的分隔符里。preg_split只会移除分号,保留后面的H,完全符合你的需求。
方案2:保留分号,在分号和单词之间分割
如果你希望分号留在前一个元素中(比如得到["Hello; how are you;", "Hey, I am fine"]),可以用零宽断言匹配分号和单词字符之间的位置:
$string = "Hello; how are you;Hey, I am fine"; $new = preg_split("/(?<=;)(?=\w)/", $string); print_r($new);
这里(?<=;)是正向后顾断言(检查前面是分号),(?=\w)是正向先行断言(检查后面是单词字符),分割的位置是两者之间,不会移除任何字符,只是把字符串在这个位置切开。
执行方案1的代码后,输出结果如下:
Array ( [0] => Hello; how are you [1] => Hey, I am fine )
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

