2009-11-28 5 views
1

Je ne suis pas très ferme avec les expressions régulières, donc je dois vous demander:preg_match tous les mots commencent par un @?

Comment savoir avec PHP si une chaîne contient un mot commençant par @ ??

par exemple. J'ai une chaîne comme "Ceci est pour @codeworxx" ???

Je suis désolé, mais je ne le point de départ pour ce :(

Espoir vous pouvez aider

Merci, Sascha


merci Correcte pour les résultats. - mais j'ai fait une erreur - comment implémenter dans eregi_replace?

$text = eregi_replace('/\[email protected][^\B]+/','<a href="\\1">\\1</a>', $text); 

ne fonctionne pas?!?

pourquoi? est-ce que je n'ai pas besoin d'entrer la même expression que le motif?

Répondre

5

rien match avec a quelques espaces devant un @ suivi par quelque chose d'autre que les espaces:

$ cat 1812901.php 

<?php 
    echo preg_match("/\[email protected][^\B]+/", "This should @match it"); 
    echo preg_match("/\[email protected][^\B]+/", "This should [email protected] match"); 
    echo preg_match("/\[email protected][^\B]+/", "This should match nothing and return 0"); 
    echo "\n"; 
?> 

$ php 1812901.php 
100 
+1

Vous devez remplacer le _ * _ par _ + _, de sorte qu'il n'attrape pas les mots vides – Amirshk

+0

thx, corrigé .. – miku

+0

Dépend aussi de quel mot est-ce que vous voulez utiliser \ w' au lieu de '[[\ \ B]' –

1

En supposant que vous définissez un mot une séquence de lettres sans espaces blancs entre eux, alors cela devrait être un bon point de départ pour vous:

$subject = "This is for @codeworxx"; 
$pattern = '/\s*@(.+?)\s/'; 
preg_match($pattern, $subject, $matches); 
print_r($matches); 

Explication: \s*@(.+?)\s - chercher quoi que ce soit en commençant par @, regroupez toutes les lettres, les nombres et tout ce qui n'est pas un espace (espace, tabulation, saut de ligne), jusqu'à l'espace le plus proche.

Voir la sortie du tableau $matches pour accéder aux groupes internes et aux résultats de l'expression régulière.

+2

acutally qui ne correspond pas à quelque chose ** à partir ** avec @, il attrape [email protected] aussi. –

+0

ok je vais essayer - merci :) – codeworxx

+0

@kemp: tnx, fixe – Amirshk

2

casser votre chaîne comme ceci:

$string = 'simple sentence with five words'; 
$words = explode(' ', $string); 

Ensuite, vous pouvez faire une boucle creux le tableau et vérifier si le premier caractère de chaque mot est égal à "@":

if ($stringInTheArray[0] == "@") 
+3

C'est en fait une mauvaise façon de le faire. C'est coûteux pour rien. Des expressions régulières ont été créées dans cette tâche. –

+1

qu'est-ce qui est mauvais et qu'est-ce qui est mauvais? Ce n'est pas à vous de décider. C'est une manière parfaitement normale et lisible de faire ce que l'OP veut, sans encombrer votre code avec regex. – ghostdog74

+0

@ levislevis85. Relativement parlant, en gardant à l'esprit les performances et la facilité de gestion, une simple expression régulière * est généralement préférable à la manipulation manuelle des chaînes, surtout sur les grandes chaînes, même si c'est un peu plus difficile à apprendre. code de manipulation mieux que de l'encombrer avec regexp? Au moins, ils sont généralement assez courts ;-) – Atli

0

@OP, pas besoin de regex. Juste méthodes de chaîne PHP

$mystr='This is for @codeworxx'; 
$str = explode(" ",$mystr); 
foreach($str as $k=>$word){ 
    if(substr($word,0,1)=="@"){ 
     print $word; 
    } 
} 
+0

Il serait probablement préférable de simplement séparer la chaîne sur le @ char, et assurez-vous qu'il est précédé d'un espace blanc et suivi d'un caractère valide. – Atli

+0

a voté parce que je n'ai pas utilisé regex? Quelle blague ridicule! – ghostdog74

+0

@Atli, si je veux, je peux couper les variables pour obtenir les résultats. – ghostdog74

0

Juste Incase cela est utile à quelqu'un dans le futur

/((?<!\S)@\w+(?!\S))/ 

Cela correspondra un mot contenant des caractères alphanumériques, en commençant par « @ ». Il ne correspondra pas aux mots avec "@" n'importe où mais au début du mot.

cas correspondants:

@username 
foo @username bar 
foo @username1 bar @username2 

cas d'echec:

[email protected] 
@username$ 
@@username 
Questions connexes