2009-05-07 4 views
0

je tente d'extraire toutes les instances d'un format particulier d'une chaîne:Syntaxe d'expression régulière en PHP pour extraire toutes les instances d'un format

Je me demande si mon nouveau Sony [PT # 123456ABC; Sony] a cette fonctionnalité mais mon ami dit le nouveau Toshiba [PT # AD-3232hjk; Toshiba] a cette fonctionnalité.

Je voudrais extraire:

[PT # 123456ABC; Sony]

[PT # AD-3232hjk; Toshiba]

Comme vous pouvez le voir ici, les seuls éléments des positions cohérentes:

  • [PT #
  • ;
  • ]

je tentais d'utiliser différents types de strpos(), mais en raison des longueurs différentes et les formats des numéros et des noms de fabricant, je ne pouvais pas tirer de manière fiable les cas d'une chaîne beaucoup plus grande . J'ai essayé différentes façons d'utiliser des expressions régulières pour résoudre ce problème, mais mes connaissances sont assez limitées. Après avoir extrait ces expressions et les avoir placées dans des variables, je devrai ensuite séparer les numéros de pièces et les noms de fabricants de l'expression. Cela peut également être plus facile à accomplir en utilisant des expressions régulières.

Toute aide est appréciée. Merci

Répondre

0

Je pense que cela ferait

preg_match_all("/(\[PT#\s+.*?;\s+.*?\])/", $input, $matches); 

print_r($matches); 

Altternatively, si vous voulez juste pour capturer les informations uniques

preg_match_all("/\[PT#\s+(.*?);\s+(.*?)\]/", $input, $matches); 
+0

Cela fonctionne très bien merci beaucoup! Maintenant, juste pour clarifier que c'est ainsi que fonctionne preg_match_all - La sortie semble dupliquer les données. Tableau ( [0] => Tableau ( [0] => [PT # 123456ABC; Sony] [1] => [PT # AD-3232hjk; Toshiba] ) [1] = > tableau ( [0] => [PT # 123456ABC; Sony] [1] => [PT # AD-3232hjk, Toshiba] ) ) – user103219

+1

le 0 tableau indexé a tous les matches que je crois et 1 basé a seulement ce que les parenthèses correspondaient IIRC. – alex

0

Je suppose que vous allez lire un fichier texte contenant beaucoup de ces entrées. Qu'est-ce que vous pouvez faire est:

preg_match_all("/\[PT#(.*?);[.*]?(.*?)\]/i", $text, $result); 

il mettra tous les matches dans le résultat de tableau $ et vous pouvez y accéder comme si:

echo $result[1][0]; //echos first occurrence's serial 

$ result est la colonne triée majeure et la première entrée dans un correspondance est la chaîne de correspondance complète

echo $result[0][0]; // would print [PT# 123456ABC; Sony] 
echo $result[1][0]; // would print 123456ABC 
echo $result[2][0]; // would print Sony 

espoir qui aide

EDIT: fixe les regex, s hould travailler maintenant (encore non testé)

+0

Malheureusement, cela génère un tableau vide lorsque vous tentez d'imprimer print_r $ result. – user103219

+0

C'est ce que je reçois pour m'écarter de mes pratiques normales de regex. le code devrait fonctionner maintenant. –

1
$matches = array(); 
preg_match_all("/\[PT#([^\];]+);([^\]]+)\]/", $input, $matches, PREG_SET_ORDER); 

foreach ($matches as $match) { 
    echo "id=", trim($match[1]), " brand=", trim($match[2]), "\n"; 
} 
+0

Cela fonctionne également, merci – user103219

+0

\\ [PT # \ s ([^;] ++); \ s ([^ \\]] ++) \\]: Devrait être légèrement plus rapide, ne stocke pas les backreferenes comme ils ne sont pas nécessaires et il faut aussi tenir compte des espaces blancs, vous pouvez alors supprimer le besoin d'ajuster. –

Questions connexes