удалить значение из строки - PullRequest
4 голосов
/ 22 января 2011

Если у меня есть строка с идентификаторами

$myIDs = '22,34,445,67889,23';

и мне дают значение, как мне удалить его из строки, если я точно знаю, что оно находится в строке?

$removeID = '445';

Я использую preg_replace или есть лучший способ? Например, если оно находится в середине строки и я удаляю только значение, я получу две запятые, а затем мне нужно заменить их одной запятой?

preg_replace($removeID, '', $myIDs);

ОБНОВЛЕНИЕ: Это все отличные предложения. Тем не менее, я просто подумал об одной потенциальной проблеме. Вероятно, это нужно обрабатывать как массив, а не как регулярное выражение. Как выглядит моя строка

$myIDs = '2312,23,234234';

и ID для удаления

$removeID = '23';

Слишком много потенциальных совпадений ...

Ответы [ 7 ]

3 голосов
/ 22 января 2011

Вы можете использовать регулярное выражение:

$remove = preg_quote($removeID, '/');
$regex = '/,'.$remove.'$|^'.$remove.',|^'.$remove.'$|,'.$remove.'(?=,)/';
$myIDs = preg_replace($regex, '', $myIDs);

, которое в основном говорит: замените $removeID, где перед ним стоит либо начало строки, либо запятая, а суффикс - либо конец строки, либоеще одна запятая.

Редактировать: Я изменил регулярное выражение на проверенное регулярное выражение (я проверил все возможности, и, похоже, он работает во всех случаях, о которых я могу думать)...

3 голосов
/ 22 января 2011
$array = explode(',',$myIDs);
$array = array_diff($array,array($removeID));
$output = implode(',',$array);
2 голосов
/ 22 января 2011

Вот регулярное выражение для выполнения работы для элемента "89":

/(^|,)89(?=,|$)/

Это соответствует ", 89" (или просто "89", если оно находится в начале ввода),при условии, что за ним непосредственно следует либо другое ",", либо конец ввода.

При правильном экранировании и некоторой абстракции:

<?php
$myIDs = '23,45,678967,89,12';
$toRemove = 89;

$myIDs = preg_replace('/(^|,)' . preg_quote($toRemove) . '(?=,|$)/', '', $myIDs);
?>

Проверено с несколькими входами.

Надеюсь, это поможет!

1 голос
/ 22 января 2011

Я собираюсь добавить решение:

preg_replace( '/\b(,' . $rID . '|' . $rID . ',|' . $rID . ')\b/', '', $myIDs );

т.е.

preg_replace( '/\b(,445|445,|445)\b/', '', $myIDs );

( Пример )

1 голос
/ 22 января 2011
$myarray=explode(',', $myIDs)
$excluded=preg_grep('^' . $removeID . '$', $myarray, PREG_GREP_INVERT)
$newId=join(',', $excluded)
1 голос
/ 22 января 2011
$myIDs = '1,2,3,4,5';
$remID = '5';

$myIDs = preg_replace(array("/^$remID,|(?:,|^)$remID$/","/,$remID,/"),
                      array('',','),
                      $myIDs);

Ideone Link

0 голосов
/ 22 января 2011

Самый простой способ это:

$myIDs = '22,34,445,67889,23';
$removeID = 445;

$myIDs = preg_replace("/($removeID,|,$removeID)/", '', $myIDs);

Обновление

$myIDs = preg_replace("/(^$removeID,|,$removeID$|,$removeID(?=,))/", '', $myIDs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...