2008-10-13 53 views
54

¿Cuál es la mejor/más eficiente forma de extraer el texto entre paréntesis? Digamos que quería obtener la cadena "texto" de la cadena "ignorar todo excepto esto (texto)" de la manera más eficiente posible.PHP: ¿La mejor forma de extraer texto entre paréntesis?

Hasta el momento, los mejores que he llegado con esto es:

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

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

¿Hay una mejor manera de hacer esto? Sé que, en general, usar expresiones regulares tiende a ser menos eficiente, pero a menos que pueda reducir el número de llamadas a funciones, ¿tal vez este sería el mejor enfoque? ¿Pensamientos?

+0

Puede encontrar ['s ($ fullString) -> between (" (",") ")'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/ Str.php # L412) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

96

me gustaría hacer una expresión regular y acabar de una vez. a menos que usted está haciendo suficientes iteraciones que se convierte en un gran problema de rendimiento, es simplemente más fácil de código (y entender cuando uno mira hacia atrás en él)

$text = 'ignore everything except this (text)'; 
preg_match('#\((.*?)\)#', $text, $match); 
print $match[1]; 
+0

¿No es *? ¿redundante? – Dimitry

+0

No, no es:. solo coincide con un solo personaje. –

+1

no necesariamente, ¿? es un partido perezoso sin él, una cadena como 'ignorar (todo) excepto esto (texto)', la coincidencia terminaría siendo 'everthing' excepto esto (texto ' – Owen

10

Así que, en realidad, el código que envió no funciona: substr()'s los parámetros son $ string, $ start y $ length, y los parámetros strpos()'s son $haystack, $needle. Ligeramente modificado:

$str = "ignore everything except this (text)"; 
$start = strpos($str, '('); 
$end = strpos($str, ')', $start + 1); 
$length = $end - $start; 
$result = substr($str, $start + 1, $length - 1);

Algunas sutilezas: Solía ​​$start + 1 en el parámetro de desplazamiento con el fin de ayudar a PHP a cabo mientras se hace la búsqueda strpos() en el segundo paréntesis; incrementamos $start uno y reducimos $length para excluir los paréntesis de la coincidencia.

Además, no hay error al verificar en este código: asegúrese de que $start y $end no === falso antes de realizar el substr.

En cuanto a usar strpos/substr frente a regex; en cuanto a rendimiento, este código superará a una expresión regular sin límites. Aunque es un poco más bohemio. Como y respiro strpos/substr, así que no me importa demasiado, pero alguien más puede preferir la compacidad de una expresión regular.

4

utilizar una expresión regular:

if(preg_match('!\(([^\)]+)\)!', $text, $match)) 
    $text = $match[1]; 
2

Este es un código de ejemplo para extraer todo el texto entre '[' y ']' y almacenarlo 2 matrices independientes (es decir, el texto dentro de paréntesis en una matriz y texto fuera de paréntesis en otra matriz)

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

salida: extract_text ("? hola ¿cómo estás"); producirá:

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

array(0) { 
} 

extract_text ("hola [http://www.google.com/test.mp3] ¿cómo estás?"); producirá

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


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

+1 pero ¿cómo hago lo mismo con [* y *]? Porque [] solo se puede usar en html, por ejemplo. – Mike

0

Esta función puede ser útil.

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() => que se utiliza para encontrar la posición de la primera aparición en una cadena.

strrpos() => que se utiliza para encontrar la posición de la primera aparición en una cadena.

Cuestiones relacionadas