Comunidad de diseño web y desarrollo en internet online

expresiones regulares en php

Citar            
MensajeEscrito el 13 Dic 2006 01:28 pm
A ver, el problema es el siguiente:
Escaneo una tabla de sudokus y en frontpage, me salen unas 3000 líneas de código con tablas con atributos y demás. Quiero convertirlo en un xml. Pare ello se me ocurrió que podría usr las expresioes regulares en php. Después de intentarlo un rato, no conseguí saber cómo hacer que me quede un xml con la siguiente estructura:

Código :

<table>
<tr>
<td>NUMERO</td)
</tr>
</table>

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Dic 2006 01:30 pm
eh no entiendo y de donde viene los datos, sino das la fuente de los datos como sabemos el patron?

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 13 Dic 2006 03:41 pm
Mmm cierto:

Código :

<?php
$str='3000 líneas de código como estas:
<p style=" width:44pt;">
<img src="../../../DOCUME~1/TATIANA/CONFIG~1/Temp/~DEST/escanear002/img2.jpg" width="100%"/></p></div>
<div style=" position:absolute; top:120pt; left:40pt; width:69pt; unicode-bidi:embed; direction:rtl;">

<p style=" width:69pt;">
<img src="../../../DOCUME~1/TATIANA/CONFIG~1/Temp/~DEST/escanear002/img3.jpg" width="100%"/></p></div>
<div style=" position:absolute; top:24pt; left:140pt; width:217pt; unicode-bidi:embed; direction:ltr; z-index:1;">

<table width="100%">
<tr style=" height:24pt;">
<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:left;padding-left:5pt;padding-right:0pt; vertical-align:middle;">
<span class="F000" style=" font-size:16pt;">2</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:left;padding-left:4pt;padding-right:0pt; vertical-align:middle;">
<span class="F000" style=" font-size:21pt;">1</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>
</tr><tr style=" height:26pt;">

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
<span class="F000" style=" font-size:16pt;">2</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
<span class="F100" style=" font-size:18pt;">6</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:left;padding-left:4pt;padding-right:0pt; vertical-align:middle;">
<span class="F000" style=" font-size:21pt;">1</span></td>

<td class="CSTYLE15" style="text-align:left;padding-left:3pt;padding-right:0pt; vertical-align:middle;">
<span class="F100" style=" font-size:20pt;">8</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>
</tr><tr style=" height:25pt;">

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
<span class="F100" style=" font-size:18pt;">9</span></td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>

<td class="CSTYLE15" style="text-align:left;padding-left:4pt;padding-right:0pt; vertical-align:middle;">
<span class="F100" style=" font-size:18pt;">6</span></td>
</tr><tr style=" height:25pt;">

<td class="CSTYLE15" style="text-align:center;padding-left:0pt;padding-right:0pt; vertical-align:middle;">
</td>'
  preg_match_all ('|\<table    |', $str, $output);
  //$arr=array(1,2,3,4,5,8);
  for ($i=0;$i<count($output);$i++){
   for ($j=0;$j<count($output[$i]);$j++){
  print $output[$i][$j];
  //echo count($arr);
  }
  }
?>

El patrón lo que tendría que hacer es:
buscar "<table"
omitir todo hasta ">"
buscar las etiquetas "<tr" y omitir todo hasta ">"
buscar las etiquetas "<td", omitir todo hasta ">", omitir todo hasta el número del sudoku, que tendrá la forma ">\d<"
buscar cierres "</td>","</tr" y "</table>

Y en lo que me he atascado es en cómo omitir los atributos y continuar seleccionando

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Dic 2006 07:31 pm
ok SI lo único que quieres es quitar los atributos, usa esto:

Código :

   $search = "%(<[A-Za-z]+)(.*?)(>)%is";
   $replace = "\\1\\3";
   echo preg_replace($search,$replace, $err);


Lo que hace esta expresión regular es buscar las etiquetas de apertura y elimnarles los atributos. El truco es el siguiente: \\1 \\3 <- esto es lo que casi nadie usa, y es muy útil, con eso hacemos referencia al contenido del primer y tercer paréntesis.



*Nota: la hice ahorita rápido, según yo y mi no siempre confiable compilador mental hace lo siguiente:

Teniendo este html:

Código :

<table dsadasdasda>
 <tr dsdasdas>
    <td dsadasda>
     Esto es c00l
    </td>
    <td dsadasda>
     Esto es c00l2
    </td>
  </tr>
</table>



Te regresa esto:

Código :

<table>
 <tr>
    <td>
     Esto es c00l
    </td>
    <td>
     Esto es c00l2
    </td>
  </tr>
</table>



Saludos^^

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 13 Dic 2006 09:55 pm
Gracias Dano, es justo el truco que estaba buscando ^^.
Al final Maikel (gracias otra vez) me lo dio hecho usando dos regExp y metiendo los números y espacios vacíos en un array:

Código :

<?php
   $contenido = file_get_contents("sodoku.html"); 
   $numeros   =   array();
   $sudoku   =array();
   function replace($matches)
   {
      global   $sudoku;
      preg_match("/<span(?:.*?)>([0-9]?)<\/span>/",$matches[1],$match);
      array_push($sudoku, $match[1]);
   }
   $regexp   =   "<td(?:.*?)>(.*?)<\/td>";
   preg_replace_callback("/$regexp/s", "replace", $contenido );
   header("Content-Type: text/xml"); 
   echo "<sudokus>\n";
   $lng= count($sudoku);
   for ($i=0;$i<$lng;$i+=81){
   echo "<table>\n";
      for($j=0;$j<9;$j++){
         echo "<tr>\n";
         for($k=0;$k<9;$k++){
            echo '<td>';
            echo $sudoku[$i+(9*$j)+$k];
            echo "</td>\n";
         }
         echo "</tr>\n";
      }
   echo "</table>\n";
   }
   echo "</sudokus>";
?>

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.