2010-12-03 10 views
2

J'essaie d'extraire un mot qui correspond à un modèle spécifique de diverses chaînes.Obtenir le mot de la chaîne - PHP

Les chaînes varient en longueur et en contenu.

Par exemple:

Je veux extraire un mot qui commence par jac des chaînes suivantes et remplir un tableau avec les mots complets:

  • Je l'ai acheté une veste hier.
  • Jack rentre à la maison.
  • Je veux aller à Jacksonville.

Le tableau résultant devrait être [veste, Jack, Jacksonville]

J'ai essayé d'utiliser preg_match() mais pour une raison quelconque, il ne fonctionnera pas. Aucune suggestion???

$q = "jac"; 
$str = "jacket"; 
preg_match($q,$str,$matches); 

print $matches[1]; 

Ceci renvoie null: S. Je ne sais pas quel est le problème.

+1

montrez votre code existant :-) – Erik

+0

Surtout l'expression rationnelle que vous avez essayé d'utiliser! – GWW

Répondre

4

Vous pouvez utiliser preg_match comme:

preg_match("/\b(jac.+?)\b/i", $string, $matches); 

See it

1

Vous avez à read the manual quelques centaines de fois et il finira par venir à vous.

Sinon, ce que vous essayez de capturer peut être exprimé en « chercher « JAC » suivi de 0 ou plusieurs lettres * et assurez-vous qu'il est pas précédé d'une lettre » qui vous donne: /(?<!\\w)(jac\\w*)/i

Voici un exemple avec preg_match_all() de sorte que vous pouvez capturer tous les les occurences du motif, pas seulement la première:

$q = "/(?<!\\w)(jac\\w*)/i"; 
$str = "I bought a jacket yesterday. 
Jack is going home. 
I want to go to Jacksonville."; 

preg_match_all($q,$str,$matches); 

print_r($matches[1]); 
  • note: par « lettre » Je veux dire tout « caractère de mot. » Officiellement, il comprend des chiffres et d'autres "caractères de mots". Selon les circonstances exactes, on peut préférer \ w (caractère de mot) ou \ b (limite de mot.)

Vous pouvez inclure des caractères supplémentaires en utilisant un character class.Par exemple, afin de faire correspondre un caractère de mot, ainsi que des guillemets simples, vous pouvez utiliser [\w'] et votre regexp devient:

$q = "/(?<!\\w)(jac[\\w']*)/i"; 

Vous pouvez ajouter un 's facultatif se rapportant à votre modèle existant, de sorte que vous capturez " jac » suivi d'un nombre de caractères de texte suivie éventuellement par « 's »

$q = "/(?<!\\w)(jac\\w*(?:'s)?)/i"; 

ici, le ?: dans les parenthèses signifie que vous n'avez pas réellement besoin de saisir leur contenu (parce qu'ils sont déjà à l'intérieur d'un paire de parenthèses, c'est inutile), et le ? après Les parenthèses signifient que la correspondance est optionnelle.

+0

Salut merci pour ça! J'apprécie vraiment cela. Je testais le code et réalisais que je voudrais inclure des citations, telles que, par exemple: "Jack" serait apparié de "le frère de Jack est nommé Gary." – AlexBrand

+0

Est-ce que j'utiliserais quelque chose comme ceci: /(? AlexBrand

Questions connexes