我正在使用str replace来删除逗号分隔字符串中的空格
str_replace(" ", "", $string);
我还想删除一个可能的尾随逗号,我可以这样做:
if (substr($string, -1, 1) == ',')
{
substr($string, 0, -1);
}
然后我还要爆炸到一个数组:
explode(",", $string);
为所有这些使用正则表达式会更有效吗?如果是,如何?
答案 0 :(得分:3)
这里有一个:
explode(',', trim(str_replace(' ', '', $string), ','));
准确地说 - regexp等效是:
$ms = [];
preg_match_all('/\s*([^,]+)\s*,/', $string ,$ms);
echo'<pre>',print_r($ms),'</pre>';
简单测试:
$string = 'word, word2, word3, w4, ';
$ts = microtime(true);
$r = explode(',', trim(str_replace(' ', '', $string), ','));
$te = microtime(true);
echo 'Time elapsed1: ' . ($te - $ts) . PHP_EOL;
$ts = microtime(true);
$ms = [];
preg_match_all('/\s*([^,]+)\s*,/', $string ,$ms);
$te = microtime(true);
echo 'Time elapsed2: ' . ($te - $ts) . PHP_EOL;
显示功能组合更快。
答案 1 :(得分:0)
为所有这些使用正则表达式会更有效吗?如果是,如何?
对于短串和少量重复,差异是微不足道的。但是,您使用的字符串函数使代码比正则表达式更具可读性。
关于可能的尾随逗号,我会使用rtrim()
(或trim()
删除前导和尾随逗号(如果适用)。
他们会这样结合:
$string = 'abc, d e f, g h, ';
$pieces = explode(',', rtrim(str_replace(' ', '', $string), ','));
输出:
array(3) {
[0]=>
string(3) "abc"
[1]=>
string(3) "def"
[2]=>
string(2) "gh"
}
如果您只想剥离逗号周围的空格并保持不变的值,那么您需要采用不同的方法:
$string = 'abc, d e f, g h, ';
$pieces = array_map('trim', explode(',', rtrim($string, ', ')));
var_dump($pieces);
输出:
array(3) {
[0]=>
string(3) "abc"
[1]=>
string(5) "d e f"
[2]=>
string(3) "g h"
}