PHP preg_split()问题:不分割单引号内的空格
解决单引号内内容不被拆分的正则分割方案
嘿,这个需求很常见!要实现分割时保留单引号包裹内容的完整性,我们只需要调整正则表达式,让它优先匹配单引号内的内容,再处理外部的分隔符。
修改后的代码
$string = "My name is Emma and i have a dillemma, what's the distance between 'New York' and 'Athene' ?"; $split = preg_split( '/\'[^\']+\'|\s+|(,|[<>!]?=|<>=?|>)/', $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); print_r($split);
正则表达式解释
我们给原正则加了最优先的分支 \'[^\']+\':
\':匹配开头的单引号(转义是为了在PHP字符串中正确解析)[^\']+:匹配任意非单引号的字符(确保不会匹配到闭合的单引号)\':匹配结尾的单引号- 剩下的
\s+|(,|[<>!]?=|<>=?|>)和你原来的规则一致,负责匹配外部的空格和运算符分隔符
运行结果
执行后得到的数组会完整保留单引号内的内容,不会拆分里面的空格:
Array ( [0] => My [1] => name [2] => is [3] => Emma [4] => and [5] => i [6] => have [7] => a [8] => dillemma [9] => , [10] => what's [11] => the [12] => distance [13] => between [14] => 'New York' [15] => and [16] => 'Athene' [17] => ? )
补充说明
如果你的场景中存在嵌套单引号(比如 'He said \'hello\''),这个正则就不适用了,需要调整为支持转义单引号的版本:/'(?:\\'|[^'])*'/。不过从你的示例字符串来看,目前的正则已经完全满足需求啦!
内容的提问来源于stack exchange,提问作者emma
相关产品推荐
相关产品推荐

