PHP функция для удаления всех между определенными символами в строке

Я заинтересован вfunction delete_all_between($char1, $char2, $string) который будет искать заданную $ string для $ char1 и $ char2 и, если таковой был найден, очистить $ string из подстроки между этими двумя символами,в том числе Сам $ char1 и $ char2.

Пример:

$string = 'Some valid and <script>some invalid</script> text!';
delete_all_between('<script>', '</script>', $string);

Теперь $ string должен содержать только

'Some valid and  text'; //note two spaces between 'and  text'

У кого-нибудь есть быстрое решение?

 Wahyu Kristianto23 окт. 2012 г., 15:21
 meagar♦23 окт. 2012 г., 15:16
Вы не хотите делать это, чтобы отфильтровать контент HTML. использованиеstrip_tags вместо.
 pp19dd23 окт. 2012 г., 15:16
Какова конечная цель здесь? Чтобы отфильтровать HTML?
 Miloshio23 окт. 2012 г., 15:20
@ pp19dd, чтобы удалить весь контент между определенными тегами.

Ответы на вопрос(5)

думаюsubstr() работает слишком медленно Лучший способ это:

return substr($string, 0, $beginningPos) . 
       substr($string, $endPos + strlen($end));
Решение Вопроса
<?php

$string = 'Some valid and <script>some invalid</script> text!';
$out = delete_all_between('<script>', '</script>', $string);
print($out);

function delete_all_between($beginning, $end, $string) {
  $beginningPos = strpos($string, $beginning);
  $endPos = strpos($string, $end);
  if ($beginningPos === false || $endPos === false) {
    return $string;
  }

  $textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);

  return delete_all_between($beginning, $end, str_replace($textToDelete, '', $string)); // recursion to ensure all occurrences are replaced
}
 Fabian Harmsen03 нояб. 2016 г., 13:18
очень хорошо, вы должны изменить на $ endPos = strpos ($ string, $ end, $ beginPos); чтобы получить правильный конец
 johnnydoe8201 апр. 2017 г., 15:59
@ То есть, ты абсолютно прав. Я столкнулся с той же проблемой и решил ее следующим образом: я поставил строку $ out = delete_all_between ('<script>', '</ script>', $ string); в цикле while он проверяет, есть ли тег-скрипт после удаления, и затем повторяет действие, пока не исчезнут все теги-скрипта: while (strpos ($ string, '<script>')! == false) {$ out = delete_all_between ('<script>', '</ script>', $ string); }
 Mav228709 июн. 2017 г., 20:24
Это делает это слишком сложно. Просто используйте один вкладыш ниже и проголосуйте за него!
 Tom28 сент. 2016 г., 06:20
Но если в предложении более одного <script> </ script>, будет удален только первый, а не все ...?
 mghhgm27 мая 2017 г., 17:47
Этот ответ хорош:stackoverflow.com/a/30407936/1307387

preg_replace('/START[\s\S]+?END/', '', $string);

замещатьSTART а такжеEND :) Кредиты уходят в другую ТАКУЮ ветку!

$q = str_replace('<script>', '', $string); $p = str_replace('some invalid', '', $q); echo $p;

я искал функцию, которая дает мне простое и стабильное решение, чтобы вытащить все переменные из шаблона TWIG. Предложенные регулярные выражения не работали по многим причинам, поэтому я решил просто стереть все содержимое между тегами вместо подсчета тегов ^ _ ^.

/**
     * deletes ALL the string contents between all the designated characters
     * @param $start - pattern start 
     * @param $end   - pattern end
     * @param $string - input string, 
     * @return mixed - string
     */
    function auxDeleteAllBetween($start, $end, $string) {
        // it helps to assembte comma dilimited strings
        $string = strtr($start. $string . $end, array($start => ','.$start, $end => chr(2)));
        $startPos  = 0;
        $endPos = strlen($string);
        while( $startPos !== false && $endPos !== false){
            $startPos = strpos($string, $start);
            $endPos = strpos($string, $end);
            if ($startPos === false || $endPos === false) {
                $run = false;
                return $string;
            }
            $textToDelete = substr($string, $startPos, ($endPos + strlen($end)) - $startPos);
            $string = str_replace($textToDelete, '', $string);
        }
        return $string;
    }

    /**
     * This function is intended to replace
     * //preg_match_all('/\{\%\s*([^\%\}]*)\s*\%\}|\{\{\s*([^\}\}]*)\s*\}\}/i', $this->_tplSubj, $matchesSubj);
     * which did not give intended results for some reason.
     *
     * @param $inputTpl
     * @return array
     */
    private function auxGetAllTags($inputTpl){
        $inputTpl = strtr($inputTpl, array('}}' => ','.chr(1), '{{' => chr(2)));
        return explode(',',$this->auxDeleteAllBetween(chr(1),chr(2),$inputTpl));
    }


$template = '<style>
td{border-bottom:1px solid #eee;}</style>
<p>Dear {{jedi}},<br>New {{padawan}} is waiting for your approval: </p>
<table border="0">
<tbody><tr><td><strong>Register as</strong></td><td>{{register_as}}, user-{{level}}</td></tr>
<tr><td><strong>Name</strong></td><td>{{first_name}} {{last_name}}</td></tr>...';

print_r($this->auxGetAllTags($template));

Ваш ответ на вопрос