Подтвердить что ты не робот

Функция 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);

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

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

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

4b9b3361

Ответ 1

<?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 str_replace($textToDelete, '', $string);
}

Ответ 2

Здесь oneliner:

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

Замените START и END:) Кредиты переходят в другой поток SO!

Ответ 3

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

return substr($string, 0, $beginningPos) . 
       substr($string, $endPos + strlen($end));

Ответ 4

Вы можете использовать double str_replace() $q = str_replace('<script>', '', $string); $p = str_replace('some invalid', '', $q); echo $p;

Ответ 5

На самом деле, я искал функцию, которая дает мне простое и стабильное решение для захвата всех переменных шаблона 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));

Ответ 6

<?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 str_replace($textToDelete, '', $string);
}

Это прекрасно работает, но как я могу выполнить это сотнями текстовых файлов внутри папки? Пример Foe У меня есть каталог, и я хочу удалить все содержимое между

В некоторой степени, как поиск и замена (регулярное выражение) в каталоге с помощью Notepad ++