¿Qué significan estas expresiones regulares en este código?

Estaba tratando de cambiar algunas partes de un complemento de joomla, cuando me enfrenté a esta parte y no tengo idea de lo que está haciendo.

¿Puede alguien explicarme qué son estas expresiones regulares y aquellas ${4} ¿hacer?

    $comStart = '';
    $comEnd = '';

    $output = JResponse::getBody();
    $output = preg_replace('/\<meta name=\"og\:/', '<meta property="og:', $output);
    $output = preg_replace('/\<meta name=\"fb:admins/', '<meta property="fb:admins', $output);
    $output = preg_replace('/<(\w+) (\w+)="(\w+):(\w+)" (\w+)="([a-zA-Z0-9\ \_\-\:\.\&\/\,\=\!\?]*)" \/>/i', $comStart.'<${1} ${2}="${3}:${4}" ${5}="${6}" >'.$comEnd, $output);

FYI: este complemento es para mostrar etiquetas de Facebook y Opengraph dentro de los artículos.

preguntado el 12 de junio de 12 a las 15:06

Intentan convocar a Cthulhu -

Me está haciendo sangrar por los ojos... reemplazan los elementos incorrectos con sus contrapartes correctas... el ${4} es una referencia posterior -

esos "${4}" son referencias inversas. Puedes mirar: php.net/manual/en/function.preg-replace.php --> parámetros --> reemplazo -

@faridv deberías empezar por tirarlos y ver si todo sigue funcionando :D -

¿Quizás los documentos que la gente está vinculando? -

5 Respuestas

¡NOTA SERIA!

Se desaconseja encarecidamente el uso de expresiones regulares para analizar/coincidir HTML/XML. Seriamente, no lo hagas

Básicamente, es una expresión regular para analizar/coincidir con HTML. Que puede tener efectos secundarios leves de no funciona, difícil de mantenery locura.

La ${N} los que se llaman retro-referencia, hacen referencia a los enésimos corchetes que coinciden en las expresiones regulares.


Si necesita manipular cadenas HTML en PHP, debe usar el DOMDocument clase que se hizo exactamente para esto.

Ejemplo

<?php

$html_string = <<<HTML
<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>

  <div id="target">
    This is the target DIV! <span>This span will change texts!</span>
  </div>

</body>
</html>
HTML;

$dom = new DOMDocument();
// Loading HTML from string...
$dom->loadHTML($html_string);

//Retrieve target and span elements
$target = $dom->getElementById("target");
$span = $target->getElementsByTagName("span")->item(0);

//Remove text, firstChild is the text node.
$span->removeChild($span->firstChild);
//Append new text
$span->appendChild(new DOMText("This is the new text!"));
//Change an attribute
$span->setAttribute("class", "spanny");

//Save HTML to string
$html_string = $dom->saveHTML();

echo $html_string;

Las expresiones regulares no son malas, malvadas o aterradoras, son simplemente las herramienta incorrecta para el trabajo, no clavas un clavo con un martillo neumático, ¿verdad?

Respondido el 20 de junio de 20 a las 10:06

Gracias hombre. ¿Puedes explicarme cómo puedo cambiar el contenido de ese objetivo? span con algo más usando la herramienta DOM? - farid rn

¿O es posible agregar un atributo al objetivo? - farid rn

@faridv: el ejemplo cambió para incluir ambos. - Fantasma de Madara

$output = preg_replace('/\<meta name=\"og\:/', '<meta property="og:', $output);

Reemplazar la cuerda <meta name="og: con <meta property="og:. No tiene sentido: aquí no se necesitan expresiones regulares.

$output = preg_replace('/\<meta name=\"fb:admins/', '<meta property="fb:admins', $output);

Reemplaza <meta name="fb:admins con <meta property="fb:admins. Igual de inútil: la expresión regular no es necesaria aquí.

$output = preg_replace('/<(\w+) (\w+)="(\w+):(\w+)" (\w+)="([a-zA-Z0-9\ \_\-\:\.\&\/\,\=\!\?]*)" \/>/i', $comStart.'<${1} ${2}="${3}:${4}" ${5}="${6}" >'.$comEnd, $output);

Reemplace una cadena como <word1 word2="word3:word4" word5="word6withspecialcharacterslike-:.etc." /> con <word1 word2="word3:word4" word5=word6withspecialcharacterslike-:.etc." >. Entonces solo elimina una barra diagonal antes del cierre >. Uso muy sospechoso y vudú de expresiones regulares.

Además, todas esas expresiones regulares son muy poco elegantes (por ejemplo, muchos escapes sin sentido) y muestran que quien las escribió no sabe mucho sobre expresiones regulares. Dejar que algo como esto se suelte en HTML es buscar problemas.

¡EVITAR! ¡EVITAR! ¡EVITAR!

Respondido el 12 de junio de 12 a las 16:06

¡No sé nada sobre expresiones regulares también! Creo que es más fácil para mí eliminar todas esas expresiones regulares y encontrar una mejor manera de hacerlo. - farid rn

Cada (\w+) dice encuentra una palabra y guárdala. Así que estás haciendo esto (en pseudocódigo)

find /(word1) (word2)="(word3)" (word4)="(manypossiblechars5)"/ignoring case

replace pattern with $comStart.<word1 word2="word3:word4" manypossiblechars5="word6">.$comEnd

Respondido el 12 de junio de 12 a las 16:06

El primero intenta reemplazar las etiquetas de la forma <meta name="og:... con <meta property="og:...

El segundo reemplaza de manera similar las etiquetas que comienzan <meta name="fb:admins... con <meta property="fb:admins...

Finalmente, el tercero parece tomar etiquetas de la forma <word word="word:word" word="something" \/> y los envuelve con $comStart y $comEnd.

Esto se hace emparejando las partes de la etiqueta (colocando () alrededor de ellos) y luego usando referencias inversas como ${4} para referirse a la cuarta parte emparejada.

Aquí $comStart y $comEnd están configurados en '' por lo que parece un poco inútil. También logra deshacerse de la barra inclinada de cierre de la etiqueta al mismo tiempo, ¡aunque quién sabe si eso es intencional!

Respondido el 12 de junio de 12 a las 16:06

Esas expresiones intentan corregir el código del encabezado del documento de la siguiente manera:

  1. reescritura <meta name="og:*" a '
  2. reescritura <meta name="fb:admins" a <meta property="fb:admins"
  3. reescribiendo metaetiquetas con una barra inclinada colgante a una sin ella (suponiendo que siempre tendrá dos atributos).

Este es simplemente un código horrendo, y siempre que sus plantillas no tengan esos "errores", puede tirar esta basura.

Respondido el 12 de junio de 12 a las 16:06

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