Redactor: El parámetro 'src' del iframe de Youtube se eliminó después de guardar una entrada

Creado en 13 oct. 2020  ·  7Comentarios  ·  Fuente: craftcms/redactor

Descripción

Así que solo estaba probando la configuración predeterminada de HTML Purifier que ahora permite incrustar videos de YouTube correctamente y no la elimina al guardar una entrada, sin embargo, todavía no funciona correctamente. Creo que esto se debe a que la expresión regular utilizada para determinar si la URL de iframe src es youtube o vimeo no es del todo correcta y no tiene en cuenta un caso de borde en las URL de youtube que omiten la parte https: al principio de la URL.

pasos para reproducir

  1. Vaya a youtube y tome cualquier URL de video (por ejemplo, https://www.youtube.com/watch?v=roY6H75d9wE)
  2. Use el ícono de incrustación de video en el redactor para agregar el video de YouTube anterior al editor.
  3. Guardar la entrada
  4. Vuelve y edita la misma entrada
  5. Verá que la miniatura del video de youtube ha desaparecido. Si miras el HTML en el editor, el iframe en sí está ahí, solo falta el parámetro 'src'.

Solución

Esto sucede porque cuando inserta por primera vez el video de YouTube, el HTML resultante se ve así:

<figure><iframe style="width: 500px; height: 281px;" src="//www.youtube.com/embed/roY6H75d9wE" frameborder="0" allowfullscreen=""></iframe></figure>

Como puede ver arriba, el parámetro src comienza con // , en lugar de https://

Como resultado, el src se elimina porque la expresión regular actual que se está utilizando no tiene en cuenta la posibilidad de que falte un esquema:
https://github.com/craftcms/redactor/blob/2fff5171f89538e84921119e8af533e6379ad24b/src/Field.php#L1019

Aquí hay una expresión regular que he usado en el pasado que funciona con este caso de borde:

'URI.SafeIframeRegexp' => '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',

Tenga en cuenta los corchetes adicionales y el signo de interrogación alrededor de la parte https?: marcan como opcional. También tiene en cuenta las URL de nocookie de YouTube. Por último, los caracteres . (punto) también se han escapado ya que queremos que coincida con un punto real y no con cualquier carácter.

información adicional

  • Versión artesanal: 3.5.12.1
  • Versión de PHP: 7.3
  • Controlador y versión de la base de datos: pgsql 11
  • Complementos y versiones: redactor 2.8.1
bug

Todos 7 comentarios

Además, creo que esos caracteres . (punto) en la expresión regular deben escaparse correctamente, ya que la intención es hacer coincidir un carácter . literal y no ningún carácter. He actualizado la solución de expresiones regulares anterior para escapar de ellos.

@ andris-sevcenko acaba de registrarse para ver si ha visto este problema. Gracias.

@ sidm1983 tengo. ¿Estás dispuesto a enviar un PR para esto?

Acabo de lanzar 2.8.3 que soluciona este problema.

También actualicé la configuración predeterminada de HTML Purifier para nuevos proyectos Craft. Deberá realizar este cambio manualmente si tiene un archivo config/htmlpurifier/Default.json : https://github.com/craftcms/craft/commit/2e3710956cd6d8f8a1ac572a2b10c53e714f1799

Gracias por eso @ andris-sevcenko & @brandonkelly. Disculpas, no envié un PR para esto, ya que no tuve la oportunidad en ese momento. Sin embargo, gracias por solucionarlo.

@brandonkelly , pregunta rápida sobre el cambio que hiciste en la confirmación anterior. Parece que los caracteres de puntos no se están escapando, lo que significa que coincidirán con cualquier carácter y no solo con un punto. ¿Es esto intencional?

@brandonkelly solo quería verificar si ha visto mi comentario anterior sobre cómo escapar del carácter de punto en la expresión regular. Gracias. 😊🙏🏽

¿Fue útil esta página
0 / 5 - 0 calificaciones