Як видалити частину рядка? [зачинено]


152

Як я можу видалити частину рядка?

Приклад рядка: "REGISTER 11223344 here"

Як я можу видалити "11223344"рядок із наведеного вище прикладу?


Ваше запитання незрозуміле / неоднозначне. Ви використовуєте термін remove, але, мабуть, ви маєте на увазі, extractщоб цільовий рядок міг зберігатися у базі даних.
mickmackusa

@Makyen Я впевнений, що ви скасували своє питання, щоб зробити багато відповідей правильними. Подумайте: чому ОП хоче зберегти REGISTER hereв базі даних?
mickmackusa

2
@mickmackusa delete може бути синонімом до віддалення, тобто виведення 11223344 з рядка, я не бачу тут проблеми. У гіршому випадку це неоднозначно, це, звичайно, не "похитується"
Нік

Прочитайте попередньо вандалізовані версії. @Nick stackoverflow.com/posts/2192170/revisions Правда передумає. Я був би радий бачити це питання закритим як незрозуміле.
mickmackusa

2
@mickmackusa Я це зробив ... Я не бачу вашої точки зору. Якщо у вас є така велика проблема з тим, як це написано, чому б не виправити її самостійно
Нік,

Відповіді:


220

Якщо ви спеціально орієнтуєтесь на "11223344", тоді використовуйте str_replace:

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

4
str_replace ($ пошук, $ заміна, $ предмет)
drooh

119

Ви можете використовувати str_replace () , який визначається як:

str_replace($search, $replace, $subject)

Таким чином, ви можете написати код так:

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

Якщо вам потрібна краща відповідність за допомогою регулярних виразів, ви можете використовувати preg_replace () .


2
Якщо вам потрібна відповідність регулярних виразів,
Ілля Лінн

4
Не впевнений, чому ця відповідь була розміщена, це довший дублікат відповіді Домініка і коротший дублікат відповіді Роланда ...
CPHPython

23

припускаючи, що 11223344 не є постійним

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

10
str_replace(find, replace, string, count)
  • знайти Потрібно. Визначає значення для пошуку
  • замінити Потрібно. Визначає значення для заміни значення знахідки
  • рядок обов'язковий. Вказує рядок, який потрібно шукати
  • вважати необов’язковим Змінна, що підраховує кількість замін

Відповідно до прикладу ОП:

$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
Як ви пропонуєте ОП використовувати цей псевдокод?
mickmackusa

6

Коли вам потрібна відповідність на основі правил, вам потрібно використовувати регулярний вираз

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

Це буде відповідати першому набору чисел, тому якщо вам потрібно бути більш конкретним, спробуйте:

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

preg_replace () було б набагато простіше, чи не так? us2.php.net/manual/en/function.preg-replace.php
Ілля Лінн

1
@ElijahLynn заміни вимагає видалити речі, майбутні зміни або шум порушиться. Це робити через _replace, але _match продовжує працювати.
TravisO

@TravisO добре, але ні. Ці дві майже однакові функції виконання мудро, і шанси, що майбутні зміни вплинуть на будь-яку з них, однакові . Існує така ж можливість майбутніх змін лише в _match, що робить це використання недійсним і _replace все ще працює нормально. Крім того, версія версії зазвичай дуже дотримується, щоб не гальмувати попередню функціональність, якщо це можливо.
КТ.

Тут вам не потрібна група захоплення. Насправді, використання групи захоплення зайво роздуває $matchмасив. Вилучіть круглі дужки, потім перейдіть через $match[0].
mickmackusa

5

substr () - це вбудована функція php, яка повертає частину рядка. Функція substr () буде приймати рядок як вхід, індексну форму, де потрібно обрізати рядок. і необов'язковий параметр - довжина підрядки. Ви можете переглянути належну документацію та приклад коду на http://php.net/manual/en/function.substr.php

ПРИМІТКА: індекс для рядка починається з 0.


Як ви пропонуєте, щоб ОП використовувала вашу загальну підказку для досягнення бажаного результату?
mickmackusa

Я вважаю цю відповідь невиразною і малоцінною.
mickmackusa

1

Динамічно, якщо ви хочете видалити (а) частину (-и) з (а) фіксованих індексів рядка, використовуйте цю функцію:

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

Для вашої мети:

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

Одне з його звичаїв - виконання командних рядків, якими ви знаєте їхні структури.


1
Ghostdog вже запропонував техніку вибуху-вибуху, але я не можу собі уявити, щоб розважати настільки длинним духом для такої основної операції.
mickmackusa

0

Наступний фрагмент надрукує "РЕЄСТРУЙТЕ тут"

$string = "REGISTER 11223344 here";

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

print_r($result);

API preg_replace () використовує нас, як зазначено нижче.

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

В preg_replace()цьому випадку немає абсолютно ніяких причин передавати масиви . Також немає користі від використання групи захоплення.
mickmackusa

Я згоден. Масив додається просто для зручності. Це можна знехтувати. це не принесе шкоди. Додана група захоплення для виключення чисел. Це працює відповідно до наміченого питання. А подальші модифікації та тонку настройку можна зробити на основі окремих осіб.
arango_86

Моя думка, у вашому фрагменті є зайві включення, які немає сенсу включати.
mickmackusa

-1

Виконайте наступне

$string = 'REGISTER 11223344 here';

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

Це поверне "РЕЄСТРУЙТЕ туди"

або

$string = 'REGISTER 11223344 here';

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

Це поверне "РЕЄСТРУЙТЕ тут"


4
Чи не повернеться "REGISTER__туди", з двома пробілами (подумай, підкреслення як пробіли, коментар не дозволить мені два наступні пробіли)? Маючи пробіли до і після "(. *)".
TechNyquist

6
Ця відповідь НАЙКРАЩЕ на 100% неправильна. Доведення: 3v4l.org/LDLEM чому ця відповідь має 15 УФ?
mickmackusa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.