Bir dizenin bir kısmı nasıl kaldırılır? [kapalı]


152

Bir dizenin bir kısmını nasıl kaldırabilirim?

Örnek dize: "REGISTER 11223344 here"

"11223344"Yukarıdaki örnek dizeden nasıl kaldırabilirim ?


Sorunuz Net değil / belirsiz. Terimi kullanıyorsunuz remove, ancak extracthedeflenen dizenin veritabanında depolanabileceği anlamına geliyor gibi görünüyor .
mickmackusa

@Makyen Cevapların çoğunu doğru yapmak için soruyu ortadan kaldırdığınızdan oldukça eminim. Bir düşünün: OP neden REGISTER hereveritabanına kaydetmek ister ?
mickmackusa

2
@ mickmackusa kaldırmak ile eşanlamlı olabilir, yani dizeden 11223344 alarak, burada sorunu göremiyorum. En kötüsü belirsiz, kesinlikle "vandalize" değil
Nick

Önceden tahrip edilmiş sürümleri okuyun. @Nick stackoverflow.com/posts/2192170/revisions Gerçekler fikrinizi değiştirecek. Bu sorunun Unclear olarak kapalı olduğunu görmekten memnuniyet duyarım.
mickmackusa

2
@mickmackusa Ben yaptım ... Ne demek istediğini göremiyorum Yazıldığı şekilde böyle büyük bir sorununuz varsa neden kendiniz
Nick

Yanıtlar:


220

Özellikle "11223344" ü hedefliyorsanız, şunu kullanın str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");

4
str_replace ($ arama, $ değiştir, $ konu)
drooh

119

Şu şekilde tanımlanan str_replace () yöntemini kullanabilirsiniz :

str_replace($search, $replace, $subject)

Böylece kodu şöyle yazabilirsiniz:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

Normal ifadelerle daha iyi eşleşmeye ihtiyacınız varsa preg_replace () öğesini kullanabilirsiniz .


2
Eğer regex eşleşmesi gerekiyorsa preg_replace () us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

4
Bu cevabın neden gönderildiğinden emin değilim, bu Dominic'in cevabının daha uzun bir kopyası ve Roland'ın cevabının daha kısa bir kopyası ...
CPHPython

23

11223344'ün sabit olmadığı varsayılarak

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

10
str_replace(find, replace, string, count)
  • Bulun Gerekli. Değer belirtir bulmak
  • değiştirin Gerekli. Değer belirtir yerine değeri find
  • dize Gerekli. Belirtir dize edilecek arandı
  • sayma İsteğe bağlı. Değiştirme sayısını sayan bir değişken

OP örneğine göre:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
OP'nin bu sahte kodu kullanmasını nasıl öneriyorsunuz?
mickmackusa

6

Kural tabanlı eşleşmeye ihtiyacınız olduğunda normal ifade kullanmanız gerekir

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

Bu, ilk sayı kümesiyle eşleşecektir, bu nedenle daha spesifik olmanız gerekiyorsa:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace () çok daha kolay olurdu değil mi? us2.php.net/manual/tr/function.preg-replace.php
Elijah Lynn

1
@ElijahLynn replace bir şeyleri kaldırmanızı gerektirir, gelecekteki değişiklikler veya gürültü bozulur. Bunu _replace ancak _match ile yapmaya devam edersiniz.
TravisO

@TravisO iyi evet, ama hayır. Bu ikisi uygulama açısından hemen hemen aynı işlevlerdir ve gelecekteki değişikliklerin herhangi birini etkileme şansı aynıdır . Sadece _match üzerinde ileride yapılacak değişikliklerin aynı olasılığı vardır, bu da bu kullanımı geçersiz kılar ve _replace hala iyi çalışır. Ayrıca, versiyonlama genellikle mümkünse önceki işlevselliği frenlememeye çok dikkat eder.
CT.

Burada bir yakalama grubuna ihtiyacınız yok. Aslında, yakalama grubunu kullanmak $matchdiziyi gereksiz yere şişirir . Parantezleri kaldırın ve ardından erişim sağlayın $match[0].
mickmackusa

5

substr (), bir dizenin bir kısmını döndüren yerleşik bir php işlevidir. Substr () işlevi, dizeyi kırpılmasını istediğiniz dizin formu olarak giriş olarak alır. ve isteğe bağlı bir parametre alt dizenin uzunluğudur. Uygun belgeleri ve örnek kodu http://php.net/manual/en/function.substr.php adresinde görebilirsiniz.

NOT: bir dizenin dizini 0 ile başlar.


OP'nin istenen sonucu elde etmek için genel ipucunuzu kullanmasını nasıl öneriyorsunuz?
mickmackusa

Bu cevabı belirsiz ve düşük değerli buluyorum.
mickmackusa

1

Dinamik olarak, bir dizenin (a) sabit dizininden (a) parçalarını kaldırmak istiyorsanız, bu işlevi kullanın:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

Amacınız için:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

Kullanımlarından biri, yapılarını bildiğiniz komut benzeri dizeleri yürütmektir.


1
Ghostdog zaten patlayan bir implode tekniği önerdi, ancak böyle temel bir operasyon için böyle uzun bir rüzgar tekniğini eğlendiremiyorum.
mickmackusa

0

Aşağıdaki kod parçası "buraya KAYIT OL" yazdıracak

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

Preg_replace () API'sı bizi aşağıda verildiği gibi kullanır.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

preg_replace()Bu durumda dizileri aktarmak için kesinlikle hiçbir neden yoktur . Ayrıca bir yakalama grubu kullanmanın herhangi bir yararı yoktur.
mickmackusa

Katılıyorum. Dizi kolaylık olması açısından eklenmiştir. İhmal edilebilir. hiçbir zararı olmaz. Sayıları hariç tutmak için yakalama grubu eklendi. Bu, çizilen soruya göre çalışıyor. Ve bireylere bağlı olarak daha fazla değişiklik ve ince ayar yapılabilir.
arango_86

Demek istediğim, snippet'inizde dahil edilmesi anlamsız gereksiz kapanımlar var.
mickmackusa

-1

Aşağıdakileri yapın

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

Bu, "KAYIT OL" ifadesini döndürür

veya

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

Bu, "KAYIT OL" ifadesini döndürür


4
İki boşluk ile "REGISTER__here" döndürmez mi (alt çizgi boşluk olarak düşün, yorum bana sonraki iki boşluk izin vermez)? "(. *)" Dan önce ve sonra boşluklar nedeniyle.
TechNyquist

6
Bu cevap en az% 100 yanlış. İspat: 3v4l.org/LDLEM Bu cevapta neden 15 UV var?
mickmackusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.