Php ile metin dosyaları / kelime ve deyim ara

6 Cevap php

Nasıl belirli bir metin satırı için bir dizin tarama ve php ile eşleşen tüm dosyaları listelemek istiyorsunuz?

Teşekkürler.

6 Cevap

Ben aslında birkaç gün önce bunun için bir fonksiyon yazdım ...

İşte her dosyayı tarar baz işlevi var ...

foreach (glob("<directory>/*.txt") as $search) {
    $contents = file_get_contents($search);
    if (!strpos($contents, "text")) continue;
    $matches[] = $search;
}

Bunu yapmanın en gelişmiş yolu, benim işlevi çok daha uzun ama aynı zamanda benim çeşitli diğer sınıflardan tüm fonksiyonları kullanır, bu olsa ne temelde.

Bir alternatif, php dosyalarını okumak diziler içine içerik koymak ve preg_grep gibi bir şey kullanmaktır.

Dosya sayısı potansiyel olarak çok büyük ise, bir php exec ile birlikte UNIX grep komutunu kullanmak isteyebilirsiniz.

Ben şahsen ikinci çözüm için giderdim.

İşte bu kesinlikle php başarılı olabilir nasıl önemsiz bir örneğidir ...

  1. Bir dizin içindeki tüm dosyaları / dizinleri bir listesini alın.

  2. Her dosya / dizin adı bir dosya olup olmadığını kontrol edin

  3. Bir dosyanın içeriğini almak

  4. Aradığımız dize eşleşmeleri aramak için bir dize arama işlevini kullanın. Bir maç varsa, dosya adını yazdırmak

Meep

<?php
$path = 'c:\\some\\cool\\directory';
$findThisString = 'Cool Cheese';

$dir = dir($path);

// Get next file/dir name in directory
while (false !== ($file = $dir->read()))
{   
    if ($file != '.' && $file != '..')
    {
        // Is this entry a file or directory?
        if (is_file($path . '/' . $file))
        {
            // Its a file, yay! Lets get the file's contents
            $data = file_get_contents($path . '/' . $file);

            // Is the str in the data (case-insensitive search)
            if (stripos($data, $findThisString) !== false)
            {
                // sw00t! we have a match
            echo 'match found in ' . $file . "<br>\n";
            }
        }
    }
}

$dir->close();

?>

Peki, önce glob (birden uzantıları istiyorsanız, sadece çıkan dizileri birleştirme veya this kullanın) ile ilgi dosyaların bir listesini almak isteyebilirsiniz. Sonra sonucu ile döngü, file_get_contents ile dosyaları açmak ve strpos ile dize için kontrol edin.

Ben 5 kişi zaten bu çözmek için nasıl büyük cevaplar attılar, çünkü burada benim tavsiye cevap koymak değil, ama bir alternatif önerecektir.

Eğer Lucene Arama Motoru PHP uygulamasını kullanarak düşündünüz mü? En önemli bir Zend Framework değil. En iyi şey, (- ekleme yolu Zend Kütüphaneler dizin eklemek için hatırlamak sadece kütüphane tabanı dosyasını dahil) Lucene kütüphane kullanımı için çerçeve kullanmak zorunda kalmamasıdır.

Ben kendim kullanmadım, ve bu konuda çok karışık eleştiriler duydum. Düşünebildiğim tek şey küçük bir komut dosyası veya proje için çok karmaşık olabilir olmasıdır.

Bir büyük Ayrıntılı overview of the Lucene Library Zend Framework başvuru kılavuzunda yer almaktadır.

Dosya büyük ise, bu overkill belleğe her dosyayı okuyun ve daha sonra kendi conents aramak yaşıyor.

Eğer dizinde üzerinde okuma izinleri varsa, iğne exec ile birleştirerek bulunduğu dosyayı anlamaya egrep olabilir:

php > exec("egrep -rl 'string of what I want to find' full-or-relative-directory", $output);
php > print_r($output);
Array
(
  [0] => full-or-relative-directory/foo/bar.xml
)
php > $contents = file_get_contents($output[0]);