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


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.