用一个`-`替换多个`-`而不用正则表达式

时间:2010-04-02 14:37:34

标签: php regex

我看到很多RegExp的误用,我真的不喜欢它。)

我有字符串(由于两个str_replace s)可能看起来像这样:

.?This iš my ".stRiNg."!
          |
          V
--this-is-my---string---

有没有比

更好的方法
$string = trim(preg_replace('/[-]+/u','-', $string),'-');

得到:

this-is-my-string

7 个答案:

答案 0 :(得分:8)

preg_replace()获胜

<?php

function benchmark($callback){
  echo sprintf('%-30s: ', $callback);
  $t = microtime(true);
  foreach(range(1, 10000) as $n){
    call_user_func($callback);
  }
  echo (microtime(true)-$t)."\n";
}

function implode_explode_filter(){
  implode('-', array_filter(explode('-', '--this-is-my---string---')));
}

function preg_replace_trim(){
  preg_replace('/-+/', '-', trim('--this-is-my---string---', '-'));
}

function brant(){
  $parts = explode("-",'--this-is-my---string---');
  for($i=0;$i<count($parts);$i++) {
      if (strlen($parts[$i]) < 1) {
          unset($parts[$i]);
      }
  }
  reset($parts);
  $string = implode("-",$parts);
}

function murze_bisko(){
  $string = "--this-is-my---string---";
  while (strpos($string, "--") !== false) {
    $string = str_replace("--", "-", $string);
  }
  $string = trim($string, '-'); # both of their answers were broken until I added this line
}

benchmark('implode_explode_filter');
benchmark('preg_replace_trim');
benchmark('brant');
benchmark('murze_bisko');

# Output
# implode_explode_filter        : 0.062376976013184
# preg_replace_trim             : 0.038193941116333
# brant                         : 0.11686086654663
# murze_bisko                   : 0.058025121688843
?>

答案 1 :(得分:5)

我不明白你为什么要找'更好'的方式。你的方式在一个非常适合的地方使用一个简单的正则表达式。还有什么比这更好的呢?

答案 2 :(得分:4)

print implode('-', array_filter( explode( '-', $string) ) );

易。 :)

答案 3 :(得分:1)

更好的方法?可能不是。其他方式?是的(基本上是Brant答案的一行版本):

implode('-', array_filter(explode('-', $string), function($s) { return strlen($s); }));

请注意,您不能可靠地使用裸array_filter,因为PHP中的!!"0" == false

答案 4 :(得分:0)

$parts = explode("-",'--this-is-my---string---');
for($i=0;$i<count($parts);$i++) {
    if (strlen($parts[$i]) < 1) {
        unset($parts[$i]);
    }
}
reset($parts);
$string = implode("-",$parts);

答案 5 :(得分:0)

所以你想从

开始
--this-is-my---string---

this-is-my-string?

最好的方法是reg exp,但是如果你想在php中使用简单的解决方案,你可以使用

$string = "--this-is-my---string---";
while (! strpos($string, "--") === false) {
  $string = str_replace("--", "-", $string);
}

循环$string将包含结果。

答案 6 :(得分:0)

只是为了比赛:

$string = str_replace('--','-', str_replace('--','-', '--this-is-my---string---'));

这是最快的方法。它首先取代双倍 - 用单一然后再清理其余部分,所以只留下单一 - 留下来。