S / / / ile PHP Perl;

4 Cevap php

1 while $var =~ s/a/b/;, ve b tüm a yerini alacak: perl, ben yapabilirim. Birçok durumda, ben 1 while $var =~ s/^"(.*)"$/$1/; bir dize etrafında çift tırnak tüm çiftleri kaldırmak için daha fazla gibi kullanabilirsiniz.

Yapmak zorunda kalmadan, PHP buna benzer bir şey yapmak için bir yolu var mı

while (preg_match('/^"(.*)"$/', $var)) {
    $var = preg_replace('/^"(.*)"$/', '$1', $var, 1);
}

, Çünkü görünüşte

while ($var = preg_replace('/^"(.*)"$/', '$1', $var, 1)) { 1; }

çalışmaz.

EDIT: Ben çalışıyorum belirli bir durum, bir ilişkisel dizi değerleri içeren bir dize değerleri yerine içerir:

$text = "This is [site_name], home of the [people_type]".
$array = ('site_name' => 'StackOverflow.com', 'people_type' => 'crazy coders');

Ben yapıyor olurdu burada:

while (preg_match('/\[.*?\]/', $text)) {
    $text = preg_replace('/\[(.*?)\]/', '$array[\'$1\']', $text, 1);
}

amaçlanan çıkış olmak ile 'Bu StackOverflow.com, çılgın kodlayıcılar evidir'

4 Cevap

Tüm olgularda, size /g global yerine seçeneğini kullanarak veya regexpi yeniden (örneğin) tarafından döngü kurtulabilirsiniz:

$var =~ s/a/b/g;
$var =~ s/^("+)(.*)\1$/$2/;

Aynı desen PHP çalışması gerekir. Ayrıca diğer $limit argüman kurtulabilirsiniz preg_replace:

$text = preg_replace('/\[(.*?)\]/e', '$array[\'$1\']', $text);

Düzenli ifadeler kendi döngüler işleyebilir. RE zaten önceki yineleme işlenmiş metni işlemek beri RE dışında Döngü, verimsiz.

Böyle bir şey işe yarayabilir?

$var = preg_replace('/^("+)(.*)\1$', '$2', $var, 1);

Lütfen giriş verileri neye benziyor?

Sadece dize baş ve kuyruk çift tırnak için kontrol ediyoruz çünkü. Bu doğru ise, o zaman hiç bir geribaşvuru yakalamak gerekmez. Ayrıca, bu tamamen gereksiz 4. parametre olarak 1 gönderme yapmak istiyorum.

$var = '"foo"';

// This works
echo preg_replace( '/^"(.*)"$/', '$1', $var );

// So does this
echo preg_replace( '/^"|"$/', '', $var );

Lütfen giriş verileri farklı görünüyor Ama eğer, bu benim cevabını değiştirmek istiyorum.

EDIT

İşte gerçek verilere almak benim

class VariableExpander
{
  protected $source;

  public function __construct( array $source )
  {
    $this->setSource( $source );
  }

  public function setSource( array $source )
  {
    $this->source = $source;
  }

  public function parse( $input )
  {
    return preg_replace_callback( '/\[([a-z_]+)\]/i', array( $this, 'expand' ), $input );
  }

  protected function expand( $matches )
  {
    return isset( $this->source[$matches[1]] )
      ? $this->source[$matches[1]]
      : '';
  }
}

$text = "This is [site_name], home of the [people_type]";
$data = array(
    'site_name'   => 'StackOverflow.com'
  , 'people_type' => 'crazy coders'
);

$ve = new VariableExpander( $data );
echo $ve->parse( $text );

Sınıf sadece kapsülleme için - Eğer istedi yapılandırılmış bir şekilde yapabiliriz.

Kullan do-while:

do {
  $var = preg_replace('/^"(.*)"$/', "$1", $var, 1, $count);
} while ($count == 1);

Requires at least php-5.1.0 dolayı onun kullanımına $count.

Ayrıca yazabilirsiniz

do {
  $last = $var;
  $var = preg_replace('/^"(.*)"$/', "$1", $var);
} while ($last != $var);