PHP使用explode按空格拆分字符串时如何避免拆分引号内的内容
实现方案
直接使用preg_match_all匹配符合规则的字符串片段即可,正则可以自动跳过引号内部的空格:
<?php $string = "[categoryhome section_title='Categories' column_1_title='Gift Certificates']"; // 匹配规则:引号包裹内容/非空格非引号的连续字符 preg_match_all('/(?:\'[^\']*\'|"[^"]*"|[^\s\'"])+/', $string, $matches); $temp = $matches[0]; // 输出验证 print_r($temp);
输出结果
Array ( [0] => [categoryhome [1] => section_title='Categories' [2] => column_1_title='Gift Certificates'] )
正则说明
'[^']*':匹配单引号包裹的所有内容,包含内部空格"[^"]*":匹配双引号包裹的所有内容,包含内部空格[^\s'"]:匹配不属于空格、单引号、双引号的任意字符- 外层
(?: ... )+:将上述任意规则的连续片段合并为一个匹配结果,?:表示不需要单独捕获括号内的内容
如果需要兼容引号内部有转义引号的场景(比如'a\'b'这种格式),可以替换为如下正则:
preg_match_all('/(?:\'(?:\\\.|[^\'])*\'|"(?:\\\.|[^"])*"|[^\s\'"])+/', $string, $matches);
内容的提问来源于stack exchange,提问作者Benjoe Carandang
相关产品推荐
相关产品推荐

