Question

J'ai un fichier texte avec le contenu suivant:

---> 12455  ---> 125  ---> KKK
---> 11366  ---> 120  ---> LLL
---> 12477  ---> 120  ---> YYY

J'utilise le code PHP suivant pour rechercher le fichier "---> 124" et j'obtiens les résultats suivants:

---> 12455  ---> 125  ---> KKK
---> 12477  ---> 120  ---> YYY

Mais je veux que les résultats soient comme ceci:

---> 12455  
---> 12477  

Je veux qu'il ne renvoie que la première colonne.

<?php
    $file = 'mytext.txt';
    $searchfor = '---> ' . "124";

    // the following line prevents the browser from parsing this as HTML.
    header('Content-Type: text/plain');

    // get the file contents, assuming the file to be readable (and exist)
    $contents = file_get_contents($file);

    // escape special characters in the query
    $pattern = preg_quote($searchfor, '/');

    // finalise the regular expression, matching the whole line
    $pattern = "/^.*$pattern.*\$/m";

    // search, and store all matching occurences in $matches
    if(preg_match_all($pattern, $contents, $matches)) {
        echo implode($matches[0]);
    } else {
        echo "No matches found";
    }
?>
Était-ce utile?

La solution

Changez un peu votre approche. Au lieu de stocker le terme de recherche et le séparateur dans une seule chaîne, utilisez deux variables.

$sep = '--->';
$searchfor = '124';

$pattern = "/^$sep\s+($searchfor\d+)\s+.*/m";

// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
    echo implode(' ', $matches[1])."\n";
}

Les sorties:

12455 12477

Démo.

Autres conseils

Tout d'abord, séparez vos préoccupations:

  1. Lire le fichier
  2. Analyser le contenu
  3. Chercher

En utilisant des itérateurs, vous pouvez réaliser quelque chose de bien ici, mais il faudra une compréhension plus profonde de la POO et de l'interface itérateur. Ce que je recommanderai, c'est une approche plus simple:

<?php
//Read the file line by line
$handle = fopen('file.txt', 'r');
while(!foef($handle)){
    $content = fgets($handle);

    //Parse the line
    $content = explode('---> ', $content);

    //Analyse the line
    if($content[1] == 124){
        echo $content[0]."\n";
    }

}
fclose($handle);

Cela devrait être tout, adaptez-le comme vous le voyez, je n'ai pas testé le code ici!

monnaie "/^.*$pattern.*\$/m" à "/$pattern\d*/i"

et alors echo implode($matches[0]); à foreach($matches[0] as $item) echo "$item<br />\r\n";

Si la structure est toujours comme vous l'avez montré, alors:

  1. Lisez le fichier ligne par ligne;
  2. explode(); chaque ligne par espace  ;
  3. Lisez l'élément [1] du résultat;

Cela me semble être le plus logique. Pas besoin d regex Ici, car cela fonctionnera plus lentement puis simple explode opération.

Voici un exemple:

$handle = fopen( 'file.txt', 'r' );
if ( $handle ) {
    while ( ( $line = fgets( $handle ) ) !== false ) {
        $matches = explode( ' ', $line );
        if ( $matches[4] == '124' )
            echo $matches[1] . '<br/>';
    }
}

essaye ça:

--->\s\d{5}

Regex est exagéré ici, un simple explode('--->', $str) Et sélectionner le premier élément suffirait

$file = file_get_contents('file.txt');
$lines = explode('---> ', $file);
for($i=1; $i<count($lines); $i=$i+3)
if(strpos($lines[$i], '124')!==false)
    $col[$i/3] = /*'--> ' . */$lines[$i];
print_r($col);

Cela semble fonctionner très bien. Décommente le commentaire ci-dessus si vous voulez le -> inclus dans la sortie. En outre, le tableau $ COL résultant est indexé avec le numéro de ligne qu'il est trouvé. Remplacez simplement [$ i / 3] par [] si vous ne voulez pas cela.

Fourniture ceci:

function SearchFileByColumn($contents, $col_num, $search, $col_count = 3) {
    $segs = explode('---> ', $contents);
    for($i=$col_num; $i<count($segs); $i=$i+$col_count)
        if(strpos($segs[$i], $search) !== false)
            $res[] = $segs[$i];
    return $res;
}

$results = SearchFileByColumn($contents, 1, '124');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top