2010-03-22 20 views
9

Estoy tratando de encontrar todas las instancias de @nombre de usuario en el texto del comentario y reemplazarlo por un enlace. Aquí está mi PHP hasta ahora:Regex para que coincida con el espacio en blanco o el final de la cadena

$comment = preg_replace('/@(.+?)\s/', '<a href="https://stackoverflow.com/users/${1}/">@${1}</a> ', $comment); 

El único problema es la expresión regular depende cada vez que hay un espacio en blanco después de la referencia @ nombre de usuario. ¿Puede alguien ayudarme a modificar esto para que también coincida si está al final de la cadena?

Respuesta

8

prueba /@(\w+)/ en lugar de /@(.+?)\s/.

+0

Excelente - ¡funcionó perfectamente! ¿Puedes decirme más sobre \ w? –

+1

@Kirk: \ w simplemente coincide con cualquier carácter de 'palabra': A-Za-z0-9_ – animuson

13

Para detectar los espacios en blanco o al final de la secuencia, se debería utilizar: /@(.+?)(?=\s|$)/, pero a menos que sus nombres de usuario contienen caracteres no alfanuméricos, es más sencillo usar el \w de carácter de palabra o \b para las vacaciones de la palabra, es decir .: /@(.+?)\b/ o /@(\w)+/.

+0

¿O podríamos usar eso para determinar si agregar un espacio en blanco al final del enlace? '$ comment = preg_replace ('/ @ (. +?) (?: \ s | $) /', '@${1} $ {2}', $ comment);' – animuson

+0

Sí, pero en ese caso tendrá que usa un grupo de captura (elimina el '?:'). –

+0

¡Esto en realidad fue realmente útil! Gracias por la corrección de espacio en blanco –

Cuestiones relacionadas