En términos generales, usando expresiones regulares no es una buena manera de tratar con HTML: HTML no es lo suficientemente regular para expresiones regulares: hay demasiadas variaciones permitidas en las normas ... Y aunque los navegadores HTML que aceptar no es válido !
En PHP, ya que su pregunta se marca como php
, una gran solución que existe para filtrar la entrada del usuario es la herramienta HTMLPurifier.
Un par de cosas interesantes son:
- Permite especificar qué etiquetas específicas se permiten
- Para cada etiqueta, puede definir los atributos específicos que se les permite
Básicamente, la idea es mantener solo lo que especifique (lista blanca), en lugar de tratar de eliminar cosas malas usando una lista negra (que nunca será del todo completa).
Y si solo especifica una lista de etiquetas y atributos que no pueden dañar, solo se mantendrán y los riesgos de las inyecciones disminuirán mucho.
Citando a la página principal de HTMLPurifier:
Purificador HTML es una librería de filtros HTML compatible con los estándares escrito en PHP.
Purificador HTML no sólo eliminará todo el código malicioso (más conocido como XSS) con un fondo auditado, lista blanca todavía permisiva seguro, también se asegurará de que sus documentos están compatible con las normas, algo que sólo alcanzable con una amplia conocimiento de las especificaciones del W3C.
Sí, otra gran cosa es que el código que se obtiene como salida es válida.
Por supuesto, esto sólo permitirá limpiar/filtro/purificar el HTML de entrada; no le permitirá validar que el URL utilizado por el usuario sea ambos:
- correcto; es decir, apunta a un contenido real
- "OK" tal como lo define su sitio web; es decir, por ejemplo, hay desnudos, ...
Sobre el segundo punto, no hay mucho que uno puede hacer al respecto: la mejor solución será ya sea:
- con un moderador acepte/rechazar los contenidos antes de que se pongan en línea
- Ofrezca a los usuarios del sitio web una forma de marcar el contenido como inapropiado, de modo que un moderador tome medidas.
Básicamente, para comprobar el contenido en sí del video, no hay más remedio que tener un ser humano decir " bien" o "no bien".
Sobre el primer punto, sin embargo, hay esperanza: algunos servicios que alojan contenido tengan API que es posible que desee/Ser capaz de utilizar. Por ejemplo, Youtube proporciona una API, consulte Developer's Guide: PHP.
En su caso, la sección Retrieving a specific video entry parece prometedor: si envía una solicitud HTTP a una URL que tiene este aspecto:
http://gdata.youtube.com/feeds/api/videos/videoID
(Sustitución "videoID" por el ID del vídeo, por supuesto)
Obtendrás algo de alimentación ATOM si el video es válido; e "Id. no válido" si no es
Esto podría ayudarlo a validar al menos algunos URL a los contenidos, incluso si debe desarrollar algún código específico para cada servicio de alojamiento de contenido que gusten a sus usuarios ...
Ahora, para extraer el identificador del video de su cadena HTML ...Si usted está pensando en usar expresiones regulares, usted está equivocado ;-)
La mejor solución para extraer una parte de los datos de una cadena HTML es generalmente a:
- carga el código HTML usando un analizador DOM;
DOMDocument::loadHTML
es generalmente bastante útil, aquí
- Vaya a través del documento usando los métodos DOM; o bien, dependiendo de su situación:
DOMDocument::getElementsByTagName
, si es necesario iterar sobre todos los elementos que tienen un nombre de etiqueta específica; podría ser grande para iterar sobre todos los <object>
o <embed>
etiquetas, por ejemplo
- O, si necesita algo más complejo, se puede hacer una consulta XPath, utilizando the
DOMXPath
class y su método DOMXPath::query
.
Y el uso de DOM también permiten modificar el documento HTML usando una API estándar - lo que podría ayudar, en caso de que desee añadir algún mensaje junto al vídeo, o cualquier otra cosa como esa .
'DOMDocument' sería genial si no fuera tan defectuoso y fuera compatible con' UTF-8', parece que fue creado más para 'XML' que' HTML', sugiero usar [html5lib] (https: //github.com/html5lib) en su lugar –