recorrer - str_split php
PHP: ¿la mejor forma de extraer texto entre paréntesis? (5)
Entonces, en realidad, el código que publicó no funciona: substr()''s
parámetros de substr()''s
son $ string, $ start y $ length , y los 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: utilicé $start + 1
en el parámetro offset para ayudar a PHP a salir mientras hago la búsqueda strpos()
en el segundo paréntesis; incrementamos $start
one y reducimos $length
para excluir los paréntesis de la coincidencia.
Además, no hay error al verificar en este código: querrá asegurarse de que $start
y $end
no === false antes de realizar el substr
.
En cuanto a usar strpos/substr
versus regex; en cuanto a rendimiento, este código superará a una expresión regular sin límites. Aunque es un poco más bohemio. Yo como y respiro strpos/substr
, así que no me importa demasiado, pero alguien más puede preferir la compacidad de una expresión regular.
¿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.
Hasta ahora, lo mejor que he encontrado es esto:
$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?
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 usa para encontrar la posición de la primera aparición en una cadena.
strrpos () => que se usa para encontrar la posición de la primera aparición en una cadena.
Este es un código de muestra para extraer todo el texto entre ''['' y '']'' y almacenarlo en 2 matrices separadas (es decir, texto entre 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 ("hello [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"
}
Haría una expresión regular y terminaría de una vez. a menos que esté haciendo suficientes iteraciones que se convierta en un gran problema de rendimiento, es más fácil codificar (y comprender cuando mira hacia atrás)
$text = ''ignore everything except this (text)'';
preg_match(''#/((.*?)/)#'', $text, $match);
print $match[1];
Use una expresión regular:
if( preg_match( ''!/(([^/)]+)/)!'', $text, $match ) )
$text = $match[1];