2011-01-22 18 views
7

Supongo que esto tiene que ver con la expresión regular, pero es todo un arte, y necesito ayuda.Php para reemplazar @nombre de usuario con el enlace a la cuenta de twitter

Cuando mostramos una historia, almacenamos todo el texto en una historia varilable, digamos $.

Lo que me gustaría es hacer un str_replace (creo que eso es lo que necesito) que dice algo como esto "Si el texto contiene @ algo, conviértalo en un enlace como <a href="http://www.twitter.com/something">@something</a> - pero solo haz esto si no hay nada antes del símbolo @ "(para excluir direcciones de correo electrónico)

Además, tendríamos que detener el 'algo' si hay un espacio o puntuación después de él. para que @ algo. no se convierte en <a href="http://www.twitter.com/something.">@something.</a>

¿Alguna sugerencia sobre cómo hacer esto?

Respuesta

13
$input = preg_replace('/(^|\s)@([a-z0-9_]+)/i', 
         '$1<a href="http://www.twitter.com/$2">@$2</a>', 
         $input); 

See it

algo que corresponda @ que es precedido por un espacio en blanco o nada (cuando se está al principio).

También pueden provocar un cortocircuito usando búsqueda hacia atrás positivos como:

$input = preg_replace('/(?<=^|\s)@([a-z0-9_]+)/i', 
         '<a href="http://www.twitter.com/$1">@$1</a>', 
         $input); 

que coincide con sólo el nombre de Twitter, pero sólo si hay espacio o nada antes de eso.

+0

Gracias! Funcionó perfectamente – Andelas

+0

El segundo argumento (al segundo ejemplo) debe ser '$1'. – BudgieInWA

+0

Hola, estoy aprendiendo regex y este ejemplo es muy útil para mí. Obtengo casi todo el primer ejemplo, pero no entiendo qué significa/i al final del primer patrón. alguien se preocupa por explicar? –

6

Una búsqueda hacia atrás positiva podría hacer el truco:

preg_replace('/(?<=\s)@(.*?)/', '<a href="....com/$1">@$1</a>') 

salirse de la parte superior de mi cabeza. "Si hay un @ que está precedido por algo que es un espacio en blanco, entonces toma lo que sigue después de @ y haz el ajuste de la etiqueta html".

+1

Bueno, querrías '[a-z0-9 _-]' en lugar del '.' en la expresión regular, ¿verdad? Dado que el nombre de Twitter no puede tener caracteres especiales o espacios (que su expresión regular recogería en este momento. De hecho, comería hasta el final de la cadena) ... – ircmaxell

+0

No funciona cuando hay un nombre de Twitter en el comenzando sin un espacio antes de eso. – codaddict

+0

Esto es encontrar el símbolo "@" y crear un enlace, pero no usa el texto que sigue a @ en la URL o lo que se muestra. Entonces, lo que veo es '@' – Andelas

Cuestiones relacionadas