Jak usunąć część sznurka? [Zamknięte]

152

Jak mogę usunąć część sznurka?

Przykładowy ciąg: "REGISTER 11223344 here"

Jak mogę usunąć "11223344"z powyższego przykładowego ciągu?

siddharth
źródło
Twoje pytanie jest niejasne / niejednoznaczne. Używasz tego terminu remove, ale wydaje się prawdopodobne, że masz na myśli extract, że docelowy ciąg może być przechowywany w bazie danych.
mickmackusa
@Makyen Jestem całkiem pewny, że zdewastowałeś pytanie i poprawiłeś wiele odpowiedzi. Pomyśl o tym: dlaczego PO miałby chcieć zapisać REGISTER herew bazie danych?
mickmackusa
2
@mickmackusa remove może być synonimem take away from, czyli wyjęcie 11223344 z ciągu, nie widzę tutaj problemu. W najgorszym przypadku jest to niejednoznaczne, na pewno nie jest „zdewastowane”
Nick
Przeczytaj wersje sprzed wandalizmu. @Nick stackoverflow.com/posts/2192170/revisions Prawda zmieni Twoje zdanie. Byłbym szczęśliwy, gdyby to pytanie zostało zamknięte jako niejasne.
mickmackusa
2
@mickmackusa Zrobiłem ... Nie rozumiem, o co ci chodzi. Jeśli masz tak duży problem ze sposobem, w jaki został napisany, dlaczego nie rozwiązać go samodzielnie
Nick

Odpowiedzi:

220

Jeśli kierujesz konkretnie na „11223344”, użyj str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");
Dominic Rodger
źródło
4
str_replace ($ search, $ replace, $ subject)
drooh
119

Możesz użyć str_replace () , która jest zdefiniowana jako:

str_replace($search, $replace, $subject)

Możesz więc napisać kod jako:

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

Jeśli potrzebujesz lepszego dopasowania za pomocą wyrażeń regularnych, możesz użyć preg_replace () .

dhorat
źródło
2
Jeśli ktoś potrzebuje regex dopasowania jest również preg_replace () us2.php.net/manual/en/function.preg-replace.php
Eliasz Lynn
4
Nie jestem pewien, dlaczego ta odpowiedź została opublikowana, jest to dłuższa
kopia
23

zakładając, że 11223344 nie jest stała

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";
ghostdog74
źródło
10
str_replace(find, replace, string, count)
  • znajdź Wymagane. Określa wartość do znalezienia
  • wymienić Wymagane. Określa wartość, która ma zastąpić wartość w funkcji find
  • ciąg Wymagany. Określa ciąg do wyszukiwania
  • liczyć Opcjonalnie. Zmienna zliczająca liczbę zastąpień

Jak na przykładzie OP:

$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"
Stnfordly
źródło
1
Jak proponujesz, aby OP używała tego pseudokodu?
mickmackusa
6

Kiedy potrzebujesz dopasowywania opartego na regułach, musisz użyć wyrażenia regularnego

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

To będzie pasować do pierwszego zestawu liczb, więc jeśli chcesz być bardziej szczegółowy, spróbuj:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];
TravisO
źródło
preg_replace () byłoby dużo łatwiejsze, prawda? us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn
1
Zastąpienie @ElijahLynn wymaga usunięcia rzeczy, przyszłe zmiany lub hałas mogą się zepsuć. Robi to za pomocą _replace, ale _match będzie nadal działać.
TravisO
@TravisO cóż, tak, ale nie. Te dwie są prawie tymi samymi funkcjami pod względem implementacji, a szanse, że przyszłe zmiany wpłyną na którąkolwiek z nich, są takie same . Istnieje taka sama możliwość przyszłych zmian tylko dla _match, przez co to użycie jest nieprawidłowe, a _replace nadal działa poprawnie. Ponadto wersjonowanie jest zwykle bardzo uważne, aby nie hamować poprzedniej funkcjonalności, jeśli to możliwe.
CT.
Nie potrzebujesz tutaj grupy przechwytywania. W rzeczywistości użycie grupy przechwytywania niepotrzebnie powiększa $matchtablicę. Usuń nawiasy, a następnie uzyskaj dostęp przez $match[0].
mickmackusa
5

substr () to wbudowana funkcja php, która zwraca część ciągu. Funkcja substr () przyjmie łańcuch jako dane wejściowe, postać indeksu, w której chcesz, aby ciąg został przycięty. a opcjonalnym parametrem jest długość podciągu. Odpowiednią dokumentację i przykładowy kod możesz znaleźć na stronie http://php.net/manual/en/function.substr.php

UWAGA: indeks dla łańcucha zaczyna się od 0.

Umair Jabbar
źródło
W jaki sposób proponujesz, aby PO wykorzystał twoją ogólną wskazówkę, aby osiągnąć pożądany rezultat?
mickmackusa
Uważam, że ta odpowiedź jest niejasna i mało wartościowa.
mickmackusa
1

Dynamicznie, jeśli chcesz usunąć (a) część (części) z (a) stałych indeksów ciągu, użyj tej funkcji:

/**
 * 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);
}

W Twoim celu:

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

Jednym z jego zastosowań jest wykonywanie ciągów znaków podobnych do poleceń, których strukturę znasz.

MAChitgarha
źródło
1
Ghostdog już zasugerował technikę wybuchania i implodowania, ale nie wyobrażam sobie zajmowania się tak dalekowzroczną techniką do tak podstawowej operacji.
mickmackusa
0

Poniższy fragment wypisze „ZAREJESTRUJ SIĘ tutaj”

$string = "REGISTER 11223344 here";

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

print_r($result);

API preg_replace () używa nas, jak podano poniżej.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);
arango_86
źródło
Nie ma absolutnie żadnego powodu, aby przekazywać tablice preg_replace()w tym przypadku. Nie ma też żadnych korzyści z używania grupy przechwytywania.
mickmackusa
Zgadzam się. Tablica została dodana tylko dla wygody. Można to zaniedbać. nie zaszkodzi. Dodano grupę przechwytywania do wykluczania numerów. Działa to zgodnie z wykreślonym pytaniem. Dalsze modyfikacje i dostrojenie można przeprowadzić w oparciu o indywidualne osoby.
arango_86
Chodzi mi o to, że w twoim fragmencie są niepotrzebne inkluzje, których nie ma sensu.
mickmackusa
-1

Wykonaj następujące czynności

$string = 'REGISTER 11223344 here';

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

To zwróci „ZAREJESTRUJ się tutaj”

lub

$string = 'REGISTER 11223344 here';

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

To zwróci „ZAREJESTRUJ SIĘ tutaj”

Elitmiar
źródło
4
Czy nie zwróci „REGISTER__tutaj” z dwoma spacjami (podkreślenie jako spacje, komentarz nie pozwoli mi na dwie kolejne spacje)? Ze względu na spacje przed i po „(. *)”.
TechNyquist
6
Ta odpowiedź jest CO NAJMNIEJ 100% błędna. Dowód: 3v4l.org/LDLEM dlaczego ta odpowiedź ma 15 UV?
mickmackusa