9
votes

PHP - Ajouter un lien à une URL dans une chaîne

J'ai une fonction qui ajoutera la balise avant un lien et après le lien. Cependant, il se casse pour certaines pages Web. Comment amélioreriez-vous cette fonction? Merci! XXX


5 commentaires

La regex est un peu bâclée, mais 99% de mes contributions auront des URL correctes si


Quelles pages Web casses-t-il?


Au début, vous testez également contre HTTPS, mais plus tard, vous omettez le "S". Ne sais pas, si cela cause cette erreur, parce que je ne sais pas non plus, quelles pages sont cassées;)


Désolé, j'ai supprimé le [S] de la regex. Comment pourrais-je inclure la fonctionnalité pour les chaînes telles que "www.google.com" ou "https: www.example.com"?


"www.google.com" va être plus difficile à analyser. Vous avez besoin d'une longue regèce pour accueillir tous les TLD.


3 Réponses :


20
votes
function processString($s) {
    return preg_replace('/https?:\/\/[\w\-\.!~#?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$s);
}

5 commentaires

Je pense qu'un "=" est manquant: il échoue lorsque l'URL contient des paramètres. Je viens de l'ajouter après le "&" et maintenant ça marche: Preg_replace ('/ https ?: \ / \ / [\ w \ - \.! ~? & = + \ * \' "(), \ /] + / ',' 0 $ ', $ s)


Vous avez oublié des adresses avec # à l'intérieur - une version si plus correcte est Preg_replace ('/ https ?: \ / \ / [\ w \ - \.! ~ #? & = + \ * \' "() /] + / ',' 0 $ ', $ texte)


Je viens de modifier la réponse pour refléter ces deux ajouts.


N'oubliez pas d'ajouter le modificateur 'U »si votre chaîne peut contenir des caractères UTF8


J'ajoute un autre caractère "%". En conséquence: '/Htttps?:\/\/[\w\-%\.!~#?&=+*\'"(),\//]+/', ' 0 $ '



1
votes

Il se casse pour toutes les URL contenant des caractères HTML "spéciaux". Pour être en sécurité, passez les trois composants de chaîne via HTMLSpecialchars () avant de les concaténer ensemble (sauf si vous souhaitez autoriser HTML à l'extérieur de l'URL).


0 commentaires

1
votes
function processString($s){
  return preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="$1">$1</a>', $s);
}
Found it here

1 commentaires

Le même scénario j'en ai besoin dans JQuery / JavaScript. Quelqu'un peut-il aider?