Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] preg_match aparenta detener proceso

Estas en el tema de preg_match aparenta detener proceso en el foro de PHP en Foros del Web. ¡buenas gente! tengo una situacion en la que no logro entender el por que. es la segunda vez que me sucede y pense que algo ...
  #1 (permalink)  
Antiguo 11/03/2011, 23:47
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
preg_match aparenta detener proceso

¡buenas gente!

tengo una situacion en la que no logro entender el por que. es la segunda vez que me sucede y pense que algo habia hecho mal la primera vez pero veo que no. se trata de un script que adquiere una serie documentos de una web, procesa el contenido y lo almacena en un documento. por supuesto, todo esto en el entorno PHP CLI de mi equipo local. en la parte del procesamiento lo que hago es buscar un contenido especifico con preg_match para luego crear un documento a base de un esquema. pues no entiendo porque el script se detiene especificamente en esta parte. no me devuelve ningun error, si intento imprimir el valor devuelto por preg_match tampoco lo hace. mi duda es si hay alguna explicacion teorica o logica del por que se detiene el script. el script es el siguiente.
Código PHP:
<?php
# adquiero el contenido de un documento html local que contiene un listado
# URLs. las URLs son extraida con preg_match_all de modo que crea un array
# donde cada elemento contiene, ademas del string pareado, la URL y el nombre
# del documento sin extension. el siguiente ejemplo es un elemento del array.
# ejemplo:
# Array
#        (
#            [0] => <a id="ctl00_MTCS_main_ctl01" href="http://technet.microsoft.com/en-us/library/bb490890.aspx"
#            [1] => http://technet.microsoft.com/en-us/library/bb490890.aspx
#            [2] => bb490890
#        )
// getting URLs
$base file_get_contents('base.html');
$content file_get_contents('command-line.html');
preg_match_all('/<a .+?href="(.+?([^\/"]+?)\.aspx)"/'$content$dataLinkPREG_SET_ORDER);

# se recorre el array de URLs. en cada ciclo se descarga el contenido y se procesa
# para crear un nuevo documento.
// download, write and strip
echo "Downloading and striping content from internet ...\n";
foreach(
$dataLink as $uri){
$filename "$uri[2].html";
$doc file_get_contents($uri[1]);
# aqui es donde se detiene
echo preg_match('@<div class="contentarea"(?:.|\s)+?</div></div>\s+</div>@i'$doc$content_area);
$document preg_replace('/\{content\}/'$content_area[0], $base);
echo 
"$filename: "file_put_contents($filename$document). " bytes\n";
}

# se crea el documento index.html a base del documento que contiene las URLs.
# basicamente cambia las rutas absolutas a rutas relativas para que se haga referencia
# a los documentos descargados.
// index.html
$content preg_replace_callback('/(<a .+?href=")(.+?([^\/"]+?)\.aspx)"/', function($matches){
return 
"$matches[1]$matches[3].html\"";
}, 
$content);
echo 
"\nCreating file: index.html "file_put_contents('index.html'$content);
?>
por si interesan hacer las pruebas, pueden descargar todos los recursos que utilizo. http://www.megaupload.com/?d=PHPV7VJS (57kb). recuerden que estoy trabajando en CLI. la solucion no es tanto lo que me interesa, sino entender el por que. a mi entender no tengo ningun fallo logistico. cualquier explicacion que me puedan brindar es bienvenida.

¡gracias
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 12/03/2011 a las 03:03 Razón: superficialmente arreglando un comentario del codigo
  #2 (permalink)  
Antiguo 12/03/2011, 00:54
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: preg_match aparenta detener proceso

Solo se me ocurre pensar en que se exceda el tiempo de ejecucion o se agote la memoria disponible para ejecutar el proceso, generalmente son solo 8mb, depende de tu configuracion en php.ini (para ambas).
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 12/03/2011, 01:46
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: preg_match aparenta detener proceso

que tal triby! hace un tiempo que ya no te veo por javascript! referente a lo mencionado, segun el CLI SAPI no tiene limite de ejecuccion aunque se le indique en php.ini puesto que esta hardcoded en CLI SAPI. y sobre la cantidad de memoria, pues estaba en 128M pero lo subi a 512M y aun asi sigue fallando. de todos modos se te agradece las sugerencias.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #4 (permalink)  
Antiguo 12/03/2011, 06:43
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: preg_match aparenta detener proceso

Entonces habria que probar las sugerencias en los comentarios al manual de preg_match_all() para ver si el problema es por el limite de stacks impuesto por PCRE.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 12/03/2011, 08:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: preg_match aparenta detener proceso

Que tal zerokilled,

El problema que estas teniendo viene por el lado de lo que comenta Triby, estas excediendo el stack, y no creo que lo soluciones cambiando la configuración(con tu ejemplo me aburrí de agregar 0's y nada), te dejo una referencia http://manpages.courier-mta.org/html...restack.3.html y te sugiero que utilices DOMDocument + DOMXpath.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 12/03/2011, 16:10
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: preg_match aparenta detener proceso

buenas...

mis agradecimiento a ambos. eventualmente el problema era de limite, especificamente limite de recursion. gracia a las referencias de ambos pude encontrar un ejemplo en el manual donde demostraba como obtener el error generado por PCRE (preg_last_error). ahi fue que me fije que el error estaba en la expresion regular en si. pensaba que al indicarle no crear backtrack era sufuciente. en si se trata de una costumbre que traigo de javascript el cual en javascript no me genera ningun error o aviso.
Código:
echo preg_match('@<div class="contentarea"(?:.|\s)+?</div></div>\s+</div>@i', $doc, $content_area);
@masterpuppet,
no hay duda que con DOMDocument seria la mejor alternativa, pero no queria huir de este problema sin entender el por que. ademas de que aun estoy capacitandome en php y aun no he llegado a esa extension de php. poco a poco llegara su momento. igual se te agradece la sugerencia.

gracias triby y masterpuppet!
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: preg_match
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:09.