str_replace соответствует только первому экземпляру - PullRequest
0 голосов
/ 17 июня 2010

Следующий вопрос к Получить весь текст между тегами с помощью preg_match_all () или лучшей функции?

Учитывая следующие данные POST:

2010-June-3
<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-1

Я хочу удалить ТОЛЬКО первый экземпляр 2010-июня-3, но следующий код удаляет все данные.

$i = 1;
$pattern = "/<remove>(.*?)<\/remove>/";
preg_match_all($pattern, $_POST['exclude'], $matches, PREG_SET_ORDER);
    if (!empty($matches)) { 
        foreach ($matches as $match) {
            // replace first instance of excluded data
            $_POST['exclude'] = str_replace($match[1], "", $_POST['exclude'], $i);  
        }
   }

echo "<br /><br />".$_POST['exclude'];

Это эхо:

<remove></remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-1

Это должно повториться:

<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-1

1 Ответ

3 голосов
/ 17 июня 2010

Вам нужно использовать preg_replace () вместо:

$_POST['exclude'] = preg_replace( '/' . preg_quote( $match[1], '/' ) . '/', "", $_POST['exclude'], 1, $i );

Переменная после $ _POST ['exclude'] является переменной limit, как вы можете видеть по ссылке выше.

Функция preg_quote () не обязательна в поле даты, но, поскольку она является переменной, может потребоваться включить специальные символы регулярного выражения.

...