2013-06-13 3 views
2

j'ai les données suivantes dans un dbConvertir les valeurs multiples crochets dans un tableau php

[508] [blah-blah-blah] Random Text 
[510] [hello-hello-hello] More random text 
[542] [stuff-stuff-stuff] Even more text 

Ceci est dans beaucoup de cellules db. Tout le bloc de texte est dans une cellule et chaque ligne du texte est séparée par un retour chariot.

Idéalement je veux le numéro dans la première tranche carrée sur chaque ligne en valeurs du tableau. Les données que je veux retrouver avec:

array(508,510,542) 

Plus important encore, je veux voir comment obtenir efficacement que la première structure de données dans un tableau. je me sens comme il devrait y avoir un moyen simple et efficace de l'utiliser, mais, en dehors de quelques regex vraiment complexe, je ne vois pas comment le faire :(

Toute aide serait magique!

+0

Quel DB utilisez-vous? – jh314

+0

Mysql est la base de données :) – bjohnb

Répondre

3

En PHP, vous pouvez correspondre les chiffres à l'aide lookarounds pour les supports littérales en utilisant preg_match_all()

<?php 

    $string = '[508] [blah-blah-blah] Random Text 
    [510] [hello-hello-hello] More random text 
    [542] [stuff-stuff-stuff] Even more text'; 
    preg_match_all ('!(?<=\[)([0-9]+)(?=\])!',$string,$matches); 
    print_r($matches[0]); 

?> 

sortie

Array 
(
    [0] => 508 
    [1] => 510 
    [2] => 542 
) 

pour gérer tous les enregistrements de la datab ase, vous feriez quelque chose comme ceci:

$result = mysqli_query($sql); 
$records = array(); 
while ($row = mysqli_fetch_array($result)){ 


     preg_match_all ('!(?<=\[)([0-9]+)(?=\])!',$row['my_text_field'],$matches); 
     foreach($matches[0] as $value){  
     $records[]=$value; 
     } 

} 

print_r($records);  
+0

Cela échouerait s'il y a plus d'une colonne qui commence par un nombre sur une ligne donnée. –

0

De la DB directement:

mysqli_query("SELECT SUBSTRING_INDEX(SUBSTRING(your_column_name, 1), ']', 1) FROM tablename"); 

SUBSTRING(str, pos) fonctionne comme substr() serait en php en ce qu'elle extrait une tranche de la chaîne d'origine.

SUBSTRING(your_column_name, 1) moyens de copie "your_column_name" à partir de l'index 1 jusqu'à la fin.

[508] [blah-blah-blah] Random Text 
Becomes 
508] [blah-blah-blah] Random Text 

SUBSTRING_INDEX(str, C, X) copie de la totalité de la chaîne str jusqu'à l'apparition Xème du caractère C

SUBSTRING_INDEX(str, ']', 1) moyens copier la toute la chaîne jusqu'à ce que la première occurrence de]

508] [blah-blah-blah] Random Text 

Devient

508 
+0

Cela ne fait qu'atteindre le premier nombre de la chaîne. S'il y en a 3 par enregistrement ... –

+0

@ AbsoluteƵERØ: En effet, j'ai mal compris et j'ai pensé qu'une ligne de l'exemple était une ligne dans la base de données. C'est un ensemble de données bizarre ... – Lepidosteus

+0

C'est cool. Je ne suis pas un pour "-1" une réponse potentielle.Certainement, c'est une entrée foirée, mais des trucs comme ça arrivent tout le temps. Ma phrase préférée est "Nous avons un fichier dans Word" ... –

1

Étant donné que vos numéros sont toujours utilisés ar au début de chaque ligne, l'expression est assez simple:

$input = <<<EOM 
[508] [blah-blah-blah] Random Text 
[510] [hello-hello-hello] More random text 
[542] [stuff-stuff-stuff] Even more text 
EOM; 

preg_match_all('/^\[(\d+)\]/m', $input, $matches); 
print_r($matches[1]); 

J'utilise le modificateur /m pour activer le mode multiligne, ce qui ^ pour correspondre au début de chaque ligne.

Questions connexes