2010-09-10 11 views
37

Używając php, staram się stworzyć skrypt, który przeszuka plik tekstowy i złapie całą linię i powtórzy ją.PHP do wyszukiwania w txt i echo całej linii

Mam plik tekstowy (.txt) zatytułowany "numorder.txt" iw tym pliku tekstowym jest kilka linii danych, z nowymi liniami przychodzącymi co 5 minut (przy użyciu zadania cron). Dane wygląda podobnie do:

2 aullah1 
7 name 
12 username 

Jak bym go o stworzenie skryptu php, który wyszuka danych „aullah1”, a następnie chwycić całą linię i echo go? (Raz powtórzył, powinien wyświetlić „2 aullah1” (bez cytatów).

Jeśli niczego nie wyjaśnia jasno i/lub chcesz mi wyjaśnić bardziej szczegółowo, prosimy o komentarz.

+1

"nowe linie przychodzą co 5 minut" - To brzmi jak dużo danych. Może powinieneś przemyśleć wszystko, co robisz i użyć zamiast tego bazy danych do przechowywania wartości. W przeciwnym razie php będzie miał duże problemy z rosnącym rozmiarem tego pliku. – poke

+0

Hej, poke, dziękuję za twoją odpowiedź i troskę. ;) Plik nie będzie naprawdę zbyt duży, tak naprawdę myślę, że w tej chwili jest to tylko około 150 linii. Chociaż aktualizuje się co 5 minut, może mieć tylko 1 linię lub maksymalnie 20 linii w czasie. W niektórych przypadkach mogę usunąć linie w celu zresetowania danych. Jedynym powodem, dla którego wspomniałem, że zaktualizowano linie, jest to, że podczas wyszukiwania w pliku tekstowym nie otrzymuję odpowiedzi opartej na liniach. Ponownie, naprawdę doceniam twoją odpowiedź i dziękuję. ;) – AUllah1

+0

możliwy duplikat [skrypt PHP do przechwytywania całej linii] (http://stackoverflow.com/questions/3539004/php-script-to-grab-entire-line) – Gordon

Odpowiedz

61

a przykład PHP, zostanie wyświetlonych wiele pasujących wierszy:

<?php 
$file = 'somefile.txt'; 
$searchfor = 'name'; 

// 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 "Found matches:\n"; 
    echo implode("\n", $matches[0]); 
} 
else{ 
    echo "No matches found"; 
} 
+3

Czy chodziło Ci o 'preg_match_all '? – poke

+2

Tak, zrobiłem, jestem przyzwyczajony do flagi JS 'g', używając jednej funkcji: o – Lekensteyn

+1

Witaj Lekensteyn, jestem niezmiernie wdzięczny za twoją odpowiedź i lubię twoje kodowanie. Chciałbym skorzystać z tego skryptu, jednak za każdym razem, gdy zastępuję tekst "name" w zmiennej $ searchfor, zawsze pojawia się błąd "No matches found". Oczywiście, to prawdopodobnie tylko ja. Może być wiele problemów, które to powodują, i spróbuję dowiedzieć się, co to jest, ale czy myślisz, że to może być kodowanie? Ponownie, przepraszam, jeśli powoduję jakiekolwiek problemy i bardzo doceniam twoją reakcję i wysiłki. Dziękuję Ci. ;) – AUllah1

4

wygląd jakbyś lepiej systeming się system("grep \"$QUERY\"") ponieważ skrypt nie będzie szczególnie wysoka wydajność albo sposób. w przeciwnym razie http://php.net/manual/en/function.file.php pokazuje, jak pętla na linie i można korzystać http://php.net/manual/en/function.strstr.php znalezienia mecze.

+0

cóż, zakładając, że ma serwer Linux ... –

+0

Cześć Novikov, dziękuję za odpowiedź, bardzo to doceniam, a także twoje wysiłki. Spróbuję sprawdzić, czy uda mi się zdobyć głowy i ogony z podanych przez ciebie linków. ;) Powodem, dla którego nie mogę zastosować podejścia systemowego, jest to, że ostatecznie zmienię skrypt w wyszukiwanie. Oczywiście, przepraszam, że nie powiedziałem tego wyraźnie. To moja wina. Przepraszam, i dziękuję za odpowiedź. ;) – AUllah1

+0

Naprawdę nie chcesz przekazać niczego do system(), shell_exec(), exec(), itp bez użycia escapeshellarg() ... często tworzy duży problem bezpieczeństwa :-) –

2

jeden sposób ...

$needle = "blah"; 
$content = file_get_contents('file.txt'); 
preg_match('~^(.*'.$needle.'.*)$~',$content,$line); 
echo $line[1]; 

choć prawdopodobnie byłoby lepiej, aby ją przeczytać wiersz po wierszu z fopen() i fread() i używać strpos()

+0

Cześć Pastel Gwałtownie, dziękuję za odpowiedź. Jest to niezwykle doceniane, gdy próbuję uruchomić ten kod, zawsze kończę z pustą stroną w mojej przeglądarce. Obecnie używam php 5.3.2, jeśli to dotyczy problemu? Ponownie, doceniam twoją odpowiedź i wysiłki. Dziękuję Ci! ;) – AUllah1

+0

Może być dowolna liczba rzeczy, np. Zła ścieżka/do/pliku, itp., Może naprawdę nie pomóc w zobaczeniu, co faktycznie zrobiłeś z tym .. ale coś takiego jest naprawdę dobre tylko dla krótkich plików. Ogólnie jak już wspominałem, lepiej byłoby przeczytać go wiersz po wierszu, którego szczegóły odpowiadają Shamittomar, więc trzymaj się tego. –

41

Czy to w ten sposób. Ta metoda pozwala przeszukać plik o rozmiarze o dowolnym rozmiarze. (duży rozmiar nie spowoduje awarii skryptu) i zwróci WSZYSTKIE wiersze pasujące do.

<?php 
$searchthis = "mystring"; 
$matches = array(); 

$handle = @fopen("path/to/inputfile.txt", "r"); 
if ($handle) 
{ 
    while (!feof($handle)) 
    { 
     $buffer = fgets($handle); 
     if(strpos($buffer, $searchthis) !== FALSE) 
      $matches[] = $buffer; 
    } 
    fclose($handle); 
} 

//show results: 
print_r($matches); 
?> 

Uwaga sposób strpos jest używany !== operatora.

+1

Jedyną wołowiną, jaką posiadam, jest tłumienie błędu. * Moim zdaniem * lepiej jest wyłączyć display_errors podczas produkcji, ale przynajmniej w ten sposób widzisz błędy i możesz je naprawić podczas pracy. +1 za dobrą odpowiedź. –

+0

Witam Shamittomar, dziękuję za odpowiedź. Bardzo to doceniam i twoje kodowanie! Dziękuję Ci. ;) Jedną rzeczą jest to, że nie podoba mi się pomysł, w jaki sposób wynik jest wyświetlany w tablicy, ponieważ potrzebuję wyniku, aby ostatecznie wyświetlić użytkownikowi końcowemu. :(Oczywiście, doceniam twoją odpowiedź, jak również twoje kodowanie .Dziękuję.;) – AUllah1

+0

@AUllah. Nie ma za co. Właśnie wydrukowałem tablicę wyników. Możesz wyświetlać tablicę w dowolny sposób. Wykonaj pętlę 'foreach' z' $ matches' i powtórz wyniki ze swoim stylem i wyborem. – shamittomar

14

Korzystanie file() i strpos():

<?php 
// What to look for 
$search = 'foo'; 
// Read from file 
$lines = file('file.txt'); 
foreach($lines as $line) 
{ 
    // Check if the line contains the string we're looking for, and print if it does 
    if(strpos($line, $search) !== false) 
    echo $line; 
} 

Podczas badania na tego pliku:

foozah
Barzah
abczah

wyprowadza go:

foozah


Aktualizacja:
Aby wyświetlić tekst, jeśli tekst nie zostanie znaleziony, należy użyć coś takiego:

<?php 
$search = 'foo'; 
$lines = file('file.txt'); 
// Store true when the text is found 
$found = false; 
foreach($lines as $line) 
{ 
    if(strpos($line, $search) !== false) 
    { 
    $found = true; 
    echo $line; 
    } 
} 
// If the text was not found, show a message 
if(!$found) 
{ 
    echo 'No match found'; 
} 

Tutaj używam $found zmienna, aby dowiedzieć się, czy znaleziono dopasowanie.

+0

Cześć Frxstrem, dziękuję za odpowiedź. Bardzo ją lubię i doceniam twoją odpowiedź. Kod wydaje się działać w sposób bajeczny, jeśli to możliwe, czy uważasz, że istnieje możliwość dodania linii "else" do tego "jeśli". Coś w liniach jako "Nie znaleziono"? Ponownie, przepraszam, jeśli proszę o zbyt wiele, tak jak jest, jest w porządku. Doceniam twoją odpowiedź i bardzo dziękuję! ;) – AUllah1

+0

@ AUllah1: To dość łatwe do zrobienia, więc zaktualizowałem swoją odpowiedź tym – Frxstrem

2
<?php 
// script.php 


    $searchfor = $_GET['keyword']; 

     $file = 'users.txt'; 

    $contents = file_get_contents($file); 
    $pattern = preg_quote($searchfor, '/'); 
    $pattern = "/^.*$pattern.*\$/m"; 

    if(preg_match_all($pattern, $contents, $matches)){ 
      echo "Found matches:<br />"; 
     echo implode("<br />", $matches[0]); 
     } 
     else{ 
      echo "No matches found"; 
     fclose ($file); 
     } 
     ?> 
+0

Czy jest to coś zupełnie nowego dla tego 5-letniego starego pytania? –

+0

'/^.*$ wzorzec. * \ $ /' Wyrażenie jest takie samo jak po prostu '/ $ wzorzec /' –

Powiązane problemy