2010-10-13 16 views
7

Estoy escribiendo una página PHP que analiza la URL dada. Lo que puedo hacer es encontrar la primera vez que aparece, pero cuando lo echo, obtengo otro valor en lugar del dado.Buscar varias posiciones de cadena en PHP

esto es lo que hice hasta ahora.

<?php 
$URL = @"my URL goes here";//get from database 
$str = file_get_contents($URL); 
$toFind = "string to find"; 
$pos = strpos(htmlspecialchars($str),$toFind); 
echo substr($str,$pos,strlen($toFind)) . "<br />"; 
$offset = $offset + strlen($toFind); 
?> 

Sé que se puede utilizar un bucle, pero no conozco la condición ni el cuerpo del bucle.

¿Y cómo puedo mostrar la salida que necesito?

+0

No sé qué es exactamente lo que quiere con este código, pero no me parece claro con qué variable desea trabajar. En este momento, se supone que debes repetir exactamente el contenido de $ toFind, ¿por qué no echo $ toFind cuando se encuentra una coincidencia? ¿O es $ pos de demasiada importancia para ti? Sin embargo, el problema parece provenir de la función htmlspecialchars(), que podría aumentar la longitud y el diseño de la cadena original. Si desea mostrar el texto coincidente, asegúrese de usarlo en la línea substráfica también. –

+0

@Pelle ten Cate: como puede ver, la respuesta que fue enviada por codaddict fue la misma que la suya.Y no solo quiero hacer un eco de $ to Find, porque usaré la posición encontrada para obtener algo de contenido después del que encuentre. – sikas

Respuesta

16

Esto sucede porque está usando strpos en el htmlspecialchars($str) pero está usando substr en $str.

htmlspecialchars() convierte caracteres especiales a entidades HTML. Tome un pequeño ejemplo:

// search 'foo' in '&foobar' 

$str = "&foobar"; 
$toFind = "foo"; 

// htmlspecialchars($str) gives you "&amp;foobar" 
// as & is replaced by &amp;. strpos returns 5 
$pos = strpos(htmlspecialchars($str),$toFind); 

// now your try and extract 3 char starting at index 5!!! in the original 
// string even though its 'foo' starts at index 1. 
echo substr($str,$pos,strlen($toFind)); // prints ar 

Para solucionar este uso el mismo pajar tanto en las funciones.

Para responder a otra cuestión de encontrar todas las ocurrencias de una cadena en otra, puede hacer uso del tercer argumento de strpos, offset, que especifica dónde buscar. Ejemplo:

$str = "&foobar&foobaz"; 
$toFind = "foo"; 
$start = 0; 
while($pos = strpos(($str),$toFind,$start) !== false) { 
     echo 'Found '.$toFind.' at position '.$pos."\n"; 
     $start = $pos+1; // start searching from next position. 
} 

de salida:

foo encuentra en la posición 1
foo encuentra en la posición 8

+0

Para elaborar un poco, htmlspecialchars reemplaza algunos caracteres por otros nuevos, lo que significa que no puede usar los mismos índices en ambas cadenas y esperar el mismo resultado. – dutt

+0

Esto resolvió un problema que es la salida. Pero, ¿y el otro problema? – sikas

+0

Eso es lo que estaba buscando: D ... gracias. – sikas

5

Uso:

while(($pos = strpos(($str),$toFind,$start)) != false) { 

explicación necesaria: Conjunto ) después de falso detrás de $start), por lo que $pos = strpos(($str),$toFind,$start) se coloca entre ().

también utilizan != false, porque php.net dice: 'Esta función puede devolver booleana FALSE, pero también puede devolver un valor no-booleano que será evaluado FALSE, como 0 o "". Lea la sección sobre Booleanos para más información. Use el operador === para probar el valor de retorno de esta función.

+0

Este es el único que no creó un bucle infinito – jocken

3
$string = '\n;alskdjf;lkdsajf;lkjdsaf \n hey judeee \n'; 
$pattern = '\n'; 
$start = 0; 
while(($newLine = strpos($string, $pattern, $start)) !== false){ 
    $start = $newLine + 1; 
    echo $newLine . '<br>'; 
} 

Esto funciona fuera de la puerta, y no se ejecuta un bucle infinito al igual que el anterior, y el indicador! == permite para un partido en la posición 0.

+0

Agreeed , la respuesta aceptada arriba casi resuelve el problema, pero $ pos siempre es VERDADERO, que se evalúa a 1 cuando se imprime, lo que da lugar a un ciclo infinito ... gracias @ user1371910 & marco – Carlton

1
$offset=0; 
$find="is"; 
$find_length= strlen($find); 
$string="This is an example string, and it is an example"; 
while ($string_position = strpos($string, $find, $offset)) { 
    echo '<strong>'.$find.'</strong>'.' Found at '.$string_position.'</br>'; 
    $offset=$string_position+$find_length; 
}