3个字符串函数作为正则表达式?

时间:2017-01-27 15:47:28

标签: php regex

我正在使用str replace来删除逗号分隔字符串中的空格

str_replace(" ", "", $string);

我还想删除一个可能的尾随逗号,我可以这样做:

if (substr($string, -1, 1) == ',')
{
    substr($string, 0, -1);
}

然后我还要爆炸到一个数组:

explode(",", $string);

为所有这些使用正则表达式会更有效吗?如果是,如何?

2 个答案:

答案 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"
}