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?
<?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
}
Je pense que substr()
fonctionne trop lentement. Le meilleur moyen est:
return substr($string, 0, $beginningPos) .
substr($string, $endPos + strlen($end));
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));
Vous pouvez utiliser double str_replace () $q = str_replace('<script>', '', $string);
$p = str_replace('some invalid', '', $q);
echo $p;