PHP preg_match_all ejecuta la función php en elementos coincidentes

No estoy seguro de la terminología, así que pido disculpas por adelantado.

Estoy tratando de crear un motor de plantillas PHP que consultará una cadena para <ZONE header> y </ZONE header> y extraerá todo lo que hay en el medio y luego ejecutará una función php para ver si existe el encabezado. Si el encabezado existe, mostrará lo que había en el medio, y si el encabezado no existe, eliminará lo que había en el medio.

He aquí un ejemplo:

$string = "
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<ZONE header><img src="images/header.jpg" /></ZONE header>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>
";

La función idealmente eliminaría <ZONE header><img src="images/header.jpg" /></ZONE header> luego ejecutará la función php que he creado header() que verifica si el "encabezado" existe en la base de datos, y si lo hace, mostrará todo lo que hay dentro <ZONE header></ZONE header> y si no lo hace, lo eliminará de la cadena.

Si existe "encabezado":

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<img src="images/header.jpg" />
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>

Si "encabezado" no existe:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>

Esto es con lo que estaba trabajando pero me quedé atascado:

        preg_match_all("|\<ZONE_header>(.*)\<\/ZONE_header>|isU", $string, $zone, PREG_SET_ORDER);

        if (isset($zone) && is_array($zone)) {
            foreach ($zone as $key => $zoneArray) {
                if ($key == 0) { 
                    $html = $zoneArray[1];
                    if ($html != "") {
                        if (header() != "") {
                            $html = str_replace($zoneArray[0], NULL, $html);
                        }
                    }                       
                }
            }
        }

        echo $html;

¿Alguna idea, pensamiento, sugerencia? ¡Gracias por cualquier ayuda!

preguntado el 22 de mayo de 12 a las 08:05

Solo una nota, en su cadena de entrada es posible que desee usar comillas simples en lugar de comillas dobles. Tenga en cuenta que su <img /> etiqueta usa comillas dobles para la propiedad src. también header() es una función de PHP, por lo que es posible que desee cambiar el nombre de la función. -

2 Respuestas

Tenga en cuenta que reemplazo su header() funcionar con get_header().

$string = preg_replace_callback('/<ZONE header>(.+)<\/ZONE header>/', 'replace_header', $string);

function replace_header($matches) {
  return get_header() ? $matches[1] : '';
}

Ver documentación para preg_replace_callback.

contestado el 22 de mayo de 12 a las 09:05

¿Me gusta esto?

$string = '
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<ZONE header><img src="images/header.jpg" /></ZONE header>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>
';
$pattern="#<ZONE header[^>]*>(.+)</ZONE header>#iU"; 

preg_match_all($pattern, $string, $matches);
if (strlen($matches[0][0])==0){
    $string=strip_tags($string,"<p>");
}
else{
    $string=strip_tags($string,"<p><img>");

}
echo $string;

contestado el 22 de mayo de 12 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.