85 votes

PHP : Meilleur moyen d'extraire le texte entre parenthèses ?

Quel est le moyen le plus efficace d'extraire du texte entre parenthèses ? Imaginons que je veuille extraire la chaîne "texte" de la chaîne "ignore tout sauf ceci (texte)" de la manière la plus efficace possible.

Jusqu'à présent, le mieux que j'ai pu trouver est ceci :

$fullString = "ignore everything except this (text)";
$start = strpos('(', $fullString);
$end = strlen($fullString) - strpos(')', $fullString);

$shortString = substr($fullString, $start, $end);

Y a-t-il une meilleure façon de procéder ? Je sais qu'en général, l'utilisation de l'expression rationnelle a tendance à être moins efficace, mais à moins que je puisse réduire le nombre d'appels de fonction, ce serait peut-être la meilleure approche ? Qu'en pensez-vous ?

0 votes

Vous pourriez trouver s($fullString)->between("(", ")") utile, comme on le trouve dans cette bibliothèque autonome .

3voto

Sachin Murali G Points 50

Voici un exemple de code pour extraire tout le texte entre '[' et ']' et le stocker dans deux tableaux séparés (c'est-à-dire le texte entre parenthèses dans un tableau et le texte hors parenthèses dans un autre tableau).

   function extract_text($string)
   {
    $text_outside=array();
    $text_inside=array();
    $t="";
    for($i=0;$i<strlen($string);$i++)
    {
        if($string[$i]=='[')
        {
            $text_outside[]=$t;
            $t="";
            $t1="";
            $i++;
            while($string[$i]!=']')
            {
                $t1.=$string[$i];
                $i++;
            }
            $text_inside[] = $t1;

        }
        else {
            if($string[$i]!=']')
            $t.=$string[$i];
            else {
                continue;
            }

        }
    }
    if($t!="")
    $text_outside[]=$t;

    var_dump($text_outside);
    echo "\n\n";
    var_dump($text_inside);
  }

Sortie : extract_text("hello how are you ?") ; produira :

array(1) {
  [0]=>
  string(18) "hello how are you?"
}

array(0) {
}

extract_text("bonjour [http://www.google.com/test.mp3] comment allez-vous ?") ; produira

array(2) {
  [0]=>
  string(6) "hello "
  [1]=>
  string(13) " how are you?"
}

array(1) {
  [0]=>
  string(30) "http://www.google.com/test.mp3"
}

0 votes

+1 mais comment faire de même pour [* et *] ? Parce que [] ne peut être utilisé que sur le html par exemple.

2voto

vijay Points 1

Cette fonction peut être utile.

    public static function getStringBetween($str,$from,$to, $withFromAndTo = false)
    {
       $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
       if ($withFromAndTo)
         return $from . substr($sub,0, strrpos($sub,$to)) . $to;
       else
         return substr($sub,0, strrpos($sub,$to));
    }
    $inputString = "ignore everything except this (text)";
    $outputString = getStringBetween($inputString, '(', ')'));
    echo $outputString; 
    //output will be test

    $outputString = getStringBetween($inputString, '(', ')', true));
    echo $outputString; 
    //output will be (test)

strpos() => qui est utilisé pour trouver la position de la première occurrence dans une chaîne.

strrpos() => qui est utilisé pour trouver la position de la première occurrence dans une chaîne.

0voto

user628176 Points 11
function getStringsBetween($str, $start='[', $end=']', $with_from_to=true){
$arr = [];
$last_pos = 0;
$last_pos = strpos($str, $start, $last_pos);
while ($last_pos !== false) {
    $t = strpos($str, $end, $last_pos);
    $arr[] = ($with_from_to ? $start : '').substr($str, $last_pos + 1, $t - $last_pos - 1).($with_from_to ? $end : '');
    $last_pos = strpos($str, $start, $last_pos+1);
}
return $arr; }

Il s'agit d'une petite amélioration de la réponse précédente qui renvoie tous les motifs sous forme de tableau :

getStringsBetween('[T]his[] is [test] string [pattern]') retournera :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X