Как удалить часть строки? [закрыто]


152

Как я могу удалить часть строки?

Пример строки: "REGISTER 11223344 here"

Как я могу удалить "11223344"из приведенного выше примера строки?


Ваш вопрос неясен / неоднозначен. Вы используете этот термин remove, но, вероятно, вы имеете в виду, extractчто целевая строка может быть сохранена в базе данных.
— mickmackusa

@ Макен Я чувствую себя довольно уверенно, что вы испортили вопрос, чтобы сделать многие ответы правильными. Подумайте об этом: почему ОП хочет сохранить REGISTER hereв базе данных?
— mickmackusa

2
@mickmackusa remove может быть синонимом take take from, то есть, вынимая 11223344 из строки, я не вижу здесь проблемы. В худшем случае это неоднозначно, это, конечно, не "вандализм"
— Ник

Прочитайте предварительно аннулированную версию (и). @Nick stackoverflow.com/posts/2192170/revisions Правда изменит ваше мнение. Я был бы рад видеть этот вопрос закрытым как неясный.
— mickmackusa

2
@mickmackusa Я сделал ... Я не понимаю твою точку зрения. Если у вас такая большая проблема с тем, как написано, почему бы не исправить это самостоятельно
— Ник

Ответы:



119

Вы можете использовать str_replace () , который определяется как:

str_replace($search, $replace, $subject)

Таким образом, вы можете написать код как:

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

Если вам нужно лучшее соответствие с помощью регулярных выражений, вы можете использовать preg_replace () .


2
Если нужно регулярное выражение соответствие есть также preg_replace () us2.php.net/manual/en/function.preg-replace.php
— Илия Линн

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)
  • найти обязательно. Определяет значение для поиска
  • заменить Обязательно. Определяет значение для замены значения в find
  • Обязательная строка . Определяет строку для поиска
  • количество необязательно. Переменная, которая считает количество замен

Согласно примеру 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"

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 требует, чтобы вы удалили вещи, будущие изменения или шум сломался бы. Делая это через _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__here» с двумя пробелами (подчеркните, что пробелами, комментарии не позволят мне два последующих пробела)? Из-за пробелов до и после "(. *)".
— TechNyquist

6
Этот ответ по крайней мере на 100% неверен. Доказательство: 3v4l.org/LDLEM, почему в этом ответе 15 UV?
— mickmackusa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.