2008-10-27 17 views
7

Tengo un editor wysiwyg en mi back-end, y está tropezando con la primera expresión regular que escribí. Esto está en PHP4, usando preg_replace(). Estoy capturando el URI y el texto vinculado.expresiones regulares - coincide con todos los anclajes con atributos opcionales

@<a\shref=\"http[s]?://([^\"]*)\"[]>(.*)<\/a>@siU 

El cliente quería que todos los enlaces externos se abra en una nueva ventana, por lo que es la expresión que estaba usando para encontrar todos (con suerte) enlaces externos, pero deje, enlaces de la página de anclaje internos, etc.

I se dio cuenta de que el editor wysiwyg también agrega style="font-weight: bold" si el usuario selecciona negrita en el enlace. Recientemente comencé a aprender expresiones regulares, así que no estoy seguro de cómo resolver este problema.

¿Cómo lo haría?

Respuesta

7

esto debe hacerlo coincidir bien:

/<a\s+([^>]*)href="https?:\/\/([^"]*)"(.*?)>(.*?)<\/a>/ 

Lo útil aquí es el partido perezoso. *? significa que coincidirá solo tanto como sea necesario, a diferencia de la coincidencia regular, que es codiciosa.

Para demostrar, con este texto:

a b c d a b c d

estas expresiones regulares tendrán resultados diferentes:

/a.*c/ selects: "a b c d a b c" 
/a.*?c/ selects: "a b c" 
Cuestiones relacionadas