de hecho, esto se soluciona mucho mejor con
expresiones regulares ![Pensando](http://static.forosdelweb.com/fdwtheme/images/smilies/scratchchin.gif)
¿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):
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);
}