web-dev-qa-db-fra.com

PHP fonction pour tout effacer entre certains caractères de la chaîne

Je m'intéresse à function delete_all_between($char1, $char2, $string) Qui cherchera dans $ string pour $ char1 et $ char2 et, si tel a été trouvé, efface $ string de la chaîne entre ces deux caractères, incluant $ char1 et $ char2 lui-même .

Exemple:

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

Maintenant, $ string devrait contenir juste 

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

Est-ce que quelqu'un a une solution rapide?

21
Miloshio
<?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
}
48
Tim S

Je pense que substr() fonctionne trop lentement. Le meilleur moyen est:

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

En fait, je cherchais une fonction qui me donne une solution simple et stable pour extraire toutes les variables du modèle TWIG . Les expressions rationnelles proposées ne fonctionnaient pas bien pour de nombreuses raisons, j’ai donc décidé de supprimer tout le contenu. entre les balises au lieu de compter les balises ^ _ ^.

/**
     * 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));
1
Alexey Abraham

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

0
lopamudra