Funzione PHP per cancellare tutto tra determinati caratteri nella string

Sono interessato alla function delete_all_between($char1, $char2, $string) che cercherà la string $ per $ char1 e $ char2 e, se è stato trovato, cancella $ string dalla sottostring tra questi due caratteri, incluso $ char1 e $ char2 stesso.

Esempio:

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

Ora, $ string dovrebbe contenere solo

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

Qualcuno ha una soluzione rapida?

 <?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); } 

Ecco un oneliner:

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

Sostituisci START e END 🙂 I crediti vanno in un'altra discussione SO!

Penso che substr() troppo lentamente. Il modo migliore è:

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

In realtà, stavo cercando una function che mi fornisse una soluzione semplice e stabile per afferrare tutte le variables del model TWIG. Le regex proposte non hanno funzionato bene per molte ragioni, quindi ho deciso di andare semplicemente cancellando tutto il contenuto tra i tag invece di contare i tag ^ _ ^.

 /** * 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, arrays($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 arrays */ private function auxGetAllTags($inputTpl){ $inputTpl = strtr($inputTpl, arrays('}}' => ','.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));