Pregunta

necesito para recuperar el contenido de la etiqueta <p> con clase dada. Clase podría simplecomment o comment ...

Así que escribió el siguiente código

preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);

Por desgracia, no devuelve nada. Sin embargo, si se quita la etiqueta termina la parte (<\/p>) funciona de alguna manera, returing la cadena que es demasiado largo (de principio etiqueta al final del documento) ...

Lo que está mal con mi expresión regular?

¿Fue útil?

Solución

Trate de usar un analizador DOM como http://simplehtmldom.sourceforge.net/

Si leo el código de ejemplo en la página de simplehtmldom correctamente se podría hacer algo como esto:

$html->find('div.simplecomment', 0)->innertext = '';

Otros consejos

La solución rápida aquí es la siguiente:

'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'

Los cambios:

  • El (.*) construcción se acaba de coincidir ciegamente todo, que para su expresión regular de trabajo, por lo que he reemplazado por completo los casos con partidos más estrictas:
    1. ... comment(.*)? ... - esto coincidirá con todo o nada, básicamente. He reemplazado esto con [^"]* ya que coincide con cero o más caracteres no " (básicamente, que coincidirá con el carácter " cierre del atributo class.
    2. ... >)(.*)<\/p> ... - de nuevo, esta coincidirá demasiado. He reemplazado con un modelo eficiente que coincida con todos los caracteres no <, y una vez que se realiza un < se comprobará si es seguido por </p>. Si lo es, se detendrá a juego (ya que estamos al final de la etiqueta <p>), de lo contrario va a continuar.
  • I eliminado la bandera m ya que no tiene uso en esta expresión regular.

Pero no será fiable (<p class="comment">...<p>...</p></p> imaginar, sino que coincidirá <p class="comment">...<p>...</p>).

Para que sea fiable, necesitará utilizar expresiones regulares recursivas o (mejor aún) un analizador de HTML (o XML si es XHTML se está tratando.) Incluso hay bibliotecas por ahí que pueden manejar incorrecto HTML " adecuadamente"(como lo hacen los navegadores.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top