2009-02-24 12 views
1

J'ai une chaîne ($ chaîne pour cet exemple) et je veux faire ce qui suit: analyser la chaîne et convertir tous les liens en "liens réels" (en ajoutant l'étiquette d'ancrage ouvrir/fermer) - quel est le meilleur façon de le faire? J'ai essayé d'utiliser preg_split() pour créer un tableau des liens contenus dans la chaîne, avec l'idée d'utiliser str_replace() après le fait pour faire les changements. Cette approche ne fonctionne pas cependant parce que j'ai du mal à isoler les liens dans la chaîne de texte w/preg_split().preg_split() et convertir tous les liens d'une chaîne en ancres?

$ chaîne pourrait contenir plusieurs liens en son sein, c'est pourquoi j'allais avec cette approche. Si je savais précisément ce que les liens étaient à l'avance ou si str_replace travaillait avec l'appariement, je serais prêt.

En bref, je ne vois pas l'approche décrite ci-dessus comme la meilleure façon de procéder. Quelle est la meilleure méthode?

  • Nicholas
+0

En plus de ma réponse ci-dessous, si vous donnez quelques exemples de chaînes que vous cherchez à partager, je peux vous donner une aide plus spécifique avec le regex . –

+0

J'ai quelques problèmes majeurs trouver un regex qui ramasser tous les URLS: Exemple: http://www.lasvegassun.com/blogs/ralstons-flash/2009/feb/17/caucus-within-gop-assembly- caucus ---- sortir-votre-/ pain avant le -flash. « @ (Https: // ([- \ w \.] +) + (: \ D +) (/ ([\ w/_ \.] * (\ \ S +)))????) @ '= regex –

Répondre

3

Ceci est précisément le genre de chose preg_replace était destiné à ...

preg_replace('/your URL regex/', '<a href="$0">$0</a>', $string); 

EDIT: whaddya savoir, top Google a frappé pour "URL regex PHP": http://snipplr.com/view/2371/regex-regular-expression-to-match-a-url/

# PHP Example: Automatically link URL's inside text. 

$text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text); 

Notez que si vous voulez faire correspondre les URL en toute généralité, vous aurez besoin d'une expression régulière diaboliquement compliqué, mais de faire correspondre le plus commun URL HTTP/HTTPS, l'expression rationnelle ci-dessus devrait fonctionner.

+0

Absolument parfait David, je rendais cela beaucoup plus compliqué que nécessaire. Je vous remercie. –

+0

Essayer de trouver une regex qui accepte les URLs comme: http://www.lasvegassun.com/blogs/ralstons-flash/2009/feb/17/caucus-within-gop-assembly-caucus out-your-/- il se casse au "-flash" –

+0

Déterminer la bonne regex pour faire correspondre les URLs mérite probablement une question qui lui est propre (et cela a peut-être déjà été posé) –

1

Je pense que vous avez mal compris le but de preg_split(). Il est utilisé pour séparer une chaîne en fonction d'une regex. Par exemple si vous avez une chaîne de données "one1two2three3four" vous pouvez utiliser preg_split avec une expression rationnelle de "\ d" et vous obtiendrez un tableau de 4 éléments retourné, composé de "un", "deux", "trois", " quatre". Donc, à moins que les liens soient toujours séparés par des caractères spécifiques, preg_split() n'est pas le bon outil pour le travail. Vous voudrez probablement utiliser preg_match(), puis faire une boucle sur les différentes correspondances renvoyées. Editer: ou comme David l'a dit, preg_replace() est encore mieux que preg_match().

0

L'expression régulière dépend de l'apparence des liens ou de leur emplacement (entre guillemets, dans une balise HTML personnalisée, etc.).

Cela dépend également de l'origine de l'entrée. S'il provient d'un utilisateur, il peut être préférable d'utiliser une syntaxe semblable à une marque.

En tout cas, consultez: http://regexlib.com/Search.aspx?k=links pour certaines expressions régulières qui prétendent correspondre URIs et tel. Vous pouvez ensuite utiliser (Posté par David):

preg_replace('/your URL regex/', '<a href="$0">$0</a>', $string); 
Questions connexes