Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/12/2009, 00:19
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 17 años
Puntos: 2534
Respuesta: ajustar tamaño de video

de hecho, esto se soluciona mucho mejor con expresiones regulares

¿porque??

sirven precisamente para solventar casos donde se presentan patrones, ya sea extraer información o bien, reemplazarla...

str_replace() funciona también, pero es muy primitivo y sirve solo para cuestiones puntuales no dinámicas, o algo así...

en este caso, el HTML a cambiar contiene el siguiente patrón (que parece que proviene de Javascript):
Cita:
width="' + cwidth + '"
este, es nuestro patrón ... ahora solo debemos elaborar nuestra expresión, y elegir la función adecuada: preg_replace()
Código PHP:
$source = <<<HTML
<object  width="' + cwidth + '" height="' + cheight + '"><param name="movie" value="http://www.megavideo.com/v/SRB7TFW0480b4ff7541dc5edd403109c47aa9317"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.megavideo.com/v/SRB7TFW0480b4ff7541dc5edd403109c47aa9317" type="application/x-shockwave-flash" allowfullscreen="true" width="' + cwidth + '" height="' + cheight + '"></embed></ object> 

HTML;

$regex '/(width|height)="\' \+ c\\1 \+ \'"/Uise';
$repl '"\\1=\"".$\\1."\""';

$width 400;
$height 260;

echo 
htmlspecialchars(preg_replace($regex$repl$source)); 
claramente, hay varios aspectos que explicar... pero bastan los importantes:


la expresión regular consta de "cierto atributo, con un valor parecido a una concatenación de javascript..."
Cita:
/ separador
(width|height) atributos
=" igual y comilla, atributo
\' \+ c\\1 \+ \' concatencion*
" comilla de cierre, atributo
/Uise separador y modificadores
* hay que notar que se escapan las caracteres especiales contenidos en el patrón, además, hace un seguimiento de la primer captura.... se prefija la letra c para corroborar el patrón (creo que se entiende, ¿cierto?)

vale, tal ves no es tan simple...

ahora lo mas importante (ya que hace toda la "magia"), el reemplazo corresponde a la lógica del modificador e de nuestra expresión, que evalúa el reemplazo directamente (¡y en el mismo contexto!) como PHP...
Código PHP:
$repl '"\\1=\"".$\\1."\""'
ésta si está fácil, solo es una cadena que representa un atributo... usando las capturas donde lo requieren, algo así...
Código PHP:
"foo=\"".$foo."\"" 
donde foo es resultado de la captura simultanea de width o height, etc..

de aquí mismo nacen las variables $width y $height que declaramos en el contexto del script, existentes ya para el momento de ejecutar nuestro reemplazo...

espero no haber sido muy técnico, suerte!!


--
Edito: después lo pensé un poco mas y me di cuenta que con str_replace() también se puede solventar:
Código PHP:
foreach (array('width' => 400'height' => 260) as $attr => $value)
{
  
$source str_replace("' + c$attr + '"$value$source);

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 30/12/2009 a las 00:34