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


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.