Ayuda con Analizador Lexico en php

Iniciado por include ();, 4 Junio 2012, 21:35 PM

0 Miembros y 1 Visitante están viendo este tema.

include ();

Hola amigos de elhacker.net necesito una ayuda para lograr hacer mi analizador lexico de xml en php, lo que llevo es, cargo la tabla de simbolos a mi base de datos y luego tengo que leer el archivo xml, lo que quiero hacer es, leer linea por linea el xml y que cuando encuentre "<" sume caracter por caracter hasta encontrar ">" y guardalo en una variable e ir a comparar contra mi base de datos, pero no se que funciones usar para hacer lo que tengo pensado y no se asi esta bien o hay una manera mas facil.

esto es lo que llevo del archivo donde quiero leer el xml como un txt.

<?php
echo 
"Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
 
while(!feof($archivo))
{
$letra=fgets($archivo);
$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>


Muchas Gracias de antemano
________________
Grandeza no es solo saber, Grandeza tambien es ayudar y compartir!!!
Grandeza no es solo saber, Grandeza es ayudar y compartir!!!

engel lex

usa strpos para buscar el"<"
http://www.php.net/manual/es/function.strpos.php

algo asi

Código (php) [Seleccionar]

$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);//para que empiece a buscar en donde consiguió el primer "<"




ahí inicio tiene el numero de caracter donde está "<" y fin el de ">"
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

include ();

#2
Cita de: engelx en  4 Junio 2012, 21:42 PM
usa strpos para buscar el"<"
http://www.php.net/manual/es/function.strpos.php

algo asi

Código (php) [Seleccionar]

$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);//para que empiece a buscar en donde consiguió el primer "<"



ahí inicio tiene el numero de caracter donde está "<" y fin el de ">"


soy nuevo en php  :-( y no se como hacer eso que me dices  :o :S disculpa tanta molestia...

Grandeza no es solo saber, Grandeza es ayudar y compartir!!!

engel lex

XD es simple XD

Código (php) [Seleccionar]


<?php
echo 
"Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
 
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
        
        
$inicio strpos("<"$letra);
        
$fin strpos(">"$letra$inicio);

        
$etiqueta substr($letra$inicio$fin-$inicio);

$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>





ahí $etiqueta contiene a lo que hay entre < y >, y substr aqui su uso

http://php.net/manual/es/function.substr.php
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

include ();

Cita de: engelx en  4 Junio 2012, 22:17 PM
XD es simple XD

Código (php) [Seleccionar]


<?php
echo 
"Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
 
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
        
        
$inicio strpos("<"$letra);
        
$fin strpos(">"$letra$inicio);

        
$etiqueta substr($letra$inicio$fin-$inicio);

$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>





ahí $etiqueta contiene a lo que hay entre < y >, y substr aqui su uso

http://php.net/manual/es/function.substr.php


No me muestra las etiquetas, y mire las funcion  substr pero no se si esa solo funciones metiendo de una vez las posiciones y lo que quiero es que lea char, es decir cuando encuentre < empiece a "concatenar" las letras hasta que encuentre >, pero como ¿?  :huh:
Grandeza no es solo saber, Grandeza es ayudar y compartir!!!

include ();

Cita de: GuateGio en  4 Junio 2012, 23:32 PM

No me muestra las etiquetas, y mire las funcion  substr pero no se si esa solo funciones metiendo de una vez las posiciones y lo que quiero es que lea char, es decir cuando encuentre < empiece a "concatenar" las letras hasta que encuentre >, pero como ¿?  :huh:


Mira estoy probando con este codigo:


<?php
echo 
"Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die(
"Problemas al abrir el archivo"); 
while(!
feof($archivo))
{

$letra=fgets($archivo); 
$inicio="<";
$fin=">";       
$etiqueta=stream_get_line($letra$inicio$fin);
$saltos=nl2br($letra);
echo 
$saltos;
echo 
$etiqueta;
}

fclose($archivo);
?>


pero me da este error:

Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25


Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
David Herrera

Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
452368

Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25

el xml de ejemplo que estoy usando es este:


<contacto>
<nombre>David Herrera</nombre>
<telefono>452368</telefono>
</contato>



Gracias por ayudarme  ;D
Grandeza no es solo saber, Grandeza es ayudar y compartir!!!

engel lex

ups sorry XD la función strpos la puse al revez XD primero el la cadena, luego lo que se va a buscar XD

Código (php) [Seleccionar]

$inicio = strpos($letra, "<")+1;// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);


el substr lo que hace es tomar un texto, desde la posición indicada, con un largo indicado (por eso resto las posiciones)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

engel lex

atream_get_line no funciona igual que substr XD

stream_get_line funciona casi igual a fgets, por pequeñas diferencias :P

http://www.php.net/manual/es/function.stream-get-line.php
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

include ();

Cita de: engelx en  4 Junio 2012, 23:56 PM
ups sorry XD la función strpos la puse al revez XD primero el la cadena, luego lo que se va a buscar XD

Código (php) [Seleccionar]

$inicio = strpos($letra, "<")+1;// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);


el substr lo que hace es tomar un texto, desde la posición indicada, con un largo indicado (por eso resto las posiciones)


Si estaba al reves la funcion  :P ya corregi el codigo quedo asi:

<?php
echo 
"Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo"); 
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta         
$inicio strpos($letra"<")+1;// le agrego +1 para quitar el primer <
$fin strpos($letra,">"$inicio);
$etiqueta substr($letra$inicio$fin-$inicio);
$saltos=n12br($letra);
echo $saltos;
echo $etiqueta;
}
fclose($archivo);
?>


y me muestra asi:

contactoDavid Herrera
nombre452368
telefono/contato

como hacer para que me muestre asi:

<contacto>
<nombre>
David Herrera
</nombre>
<telefono>
452368
</telefono>
</contato>


porque despues de eso agarrare cada una de las plabras y las ire a comparar con la tabla de simbolos:

mi tabla de simbolos es esta:


[b]Variables       Tipo     Expresion [/b]
<contacto>    PR   
<nombre>     PR   
</nombre>    PR   
nombre          ID        /^[A-Z][a-z]*s[A-Z][a-z]*$/
<telefono>    PR   
</telefono>   PR   
telefono         ID        /^(2|3)[0-9]{7}$/
</contacto>  PR   


como ves en mi tabla de simbolos si comparo la etiqueta nombre sin los < > me mostrara error o lo tomara como un ID

Muchas gracias por tomarte el tiempo de ayudarme.... ;-) :rolleyes:
Grandeza no es solo saber, Grandeza es ayudar y compartir!!!

engel lex

si no te importan los saltos de linea extras puedes hacer un str_replace
http://www.php.net/manual/es/function.substr-replace.php

Código (php) [Seleccionar]

$letra = str_replace(">",">\n",$letra);


esto va a colocar un salto de linea luego de cada ">"
(en caso de dudas \n significa salto de linea)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.