Меня интересует 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'
У кого-то есть быстрое решение?
<?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); }
Вот онлайнер:
preg_replace('/START[\s\S]+?END/', '', $string);
Замените START
и END
🙂 Кредиты переходят в другую нить SO!
Я думаю, что substr()
работает слишком медленно. Лучший способ:
return substr($string, 0, $beginningPos) . substr($string, $endPos + strlen($end));
Фактически, я искал функцию, которая дает мне простое и стабильное решение для захвата всех переменных шаблона 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));
<?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 ++