Filtrowanie tekstu w stringu

0

Czesc. Znalazlem na forum pewien przyklad wyszukiwania ale troche chcialbym aby wyniki inaczej sie wyswietlaly. Sam przyklad na razie zostawie w spokoju. Interesuje mnoe zamiana/wylapanie frazy w wyeazach i usuniecie innych - tych w ktorych fraza nie wystepuje.

$string = "ala ma kota ale kota ma tez i basia i stasio wiec wszyscy maja zryta banie";

Powiedzmy ze szukam frazy

$s = "a";

Teraz jak wylapac wszystkie wyrazy majace w sobie "a" i je wyswietlic a te ktore nie maja zostaja pomniete.

1

Nie wiem czy to jest najlepsze rozwiązanie, ale tak na szybko przyszło mi do głowy takie coś:

  1. rozbić ten tekst na poszczególne elementy/słowa - do tego służy explode - http://php.net/manual/en/function.explode.php
  2. tablicę zwróconą przez explode z pkt. 1 "przelecieć" i po kolei dla każdego elementu wykonać strpos - https://secure.php.net/manual/pl/function.strpos.php.

Podpowiedź - "przelecenie" przez tablicę określone w pkt.2 możesz zrobić w oparciu o foreach - http://php.net/manual/en/control-structures.foreach.php

1

Dzieki za nakierowanie. Zamiast substr() dalem strstr(). Wazne ze dziala. Jakby ktos chcial to podaje:

<?php

          $string = "ala ma kota ale kota ma tez i basia i stasio wiec wszyscy maja zryta banie";
			 $szukana = "t";
					 
			 
		    $ex = explode(" ", $string);
			 
			 for($i=0; $i<count($ex); $i++){
			 
			 if(strstr($ex[$i], $szukana))
			 {
			 
			 $add = $ex[$i] . " ";
			 
			 echo str_replace($szukana, "<font color=red>".$szukana."</font>", $add);
			 
			 
			 }
			 
			 }

?>

Przyklad wyłapuje tylko te wyrazy i je wyswietla ktore zawieraja szukana fraze. Dodatkowo fraza jest kolorowana w tym wyrazie szukanym.

1

No dałeś radę :) Tylko takie parę uwag:

  1. strpos czy strstr w tym przypadku nie robi żadnej różnicy, więc można stosować zgodnie z własnymi preferencjami ;)
  2. Lepiej skorzystać z foreach. Wprawdzie zrobiona przez Ciebie pętla for także działa, ale konstrukcja foreach jest przeznaczona do "przelatywania" przez tablicę, a kod z jej wykorzystaniem jest bardziej przejrzysty i fachowy
  3. tak, jak napisał @axelbest - lepiej by było zrobić z tego funkcję wywoływaną ze stosownymi parametrami
0

Ci macie na mysli mowiac o funkcji?

0

Na razie masz to po prostu wpisane do skryptu w głównym bloku. A chodzi nam o zrobienie czegoś w stylu (piszę w uproszczeniu, chodzi o oddanie sensu)


function SzukajWystapien ($CiagWejsciowy, $WartoscSzukana) {
  //TUTAJ wykonujesz stosowne działania
  return $Wartosc; 
}

echo (SzukajWystapien("ala ma kota kot ma problemy bo ala jest niestabilna emocjonalnie", "a"));

Oczywiście można to potraktować na wiele sposobów - równie dobrze można np. w głownym bloku osadzić foreach i dla każdej wartości wywołać funkcję, można foreach wsadzić do tej funkcji, można mieć także 2 funkcje: pierwszą, którą wywołujesz z dwoma parametrami (ciąg wejściowy oraz poszukiwana fraza), a ta funkcja w swoim ciele będzie zawierać foreach, który z kolei przy każdym przebiegu wywoła kolejną funkcję, która sprawdzi czy poszukiwany fragment występuje (oraz, jeśli się znajdzie, to wykona odpowiednie formatowanie).

Piękne w programowaniu jest to, że do każdego (nawet tak prostego, jak ten, którego dotyczy ten wątek) tematu można podejść na wiele sposobów, a żeby było śmieszniej - często każdy z nich jest równie dobry ;)

0

Wystąpił mały error tudzież zonk jak mowil to Pan; jak mu tam było ? Chajzer Senior. Do rzeczy.
W/w jest ok tyle ze problem pojawia sie przy iteracji w petli .
Przyklad pochodzi z tego tematu:
PHP + SQL system wycieczek
Ostatnia odpowiedz kolegi @hopaj
Pozamienialem tamto lekko na to co zrobilem ale wyswietla mi błędnie. Zamiast dla kazdego URL jeden wiersz to wyświetla rekord po rekordzie czyli za kazdym razem jest wyswietlony wyraz i nastepna linia. Jak to ugryść ??

0

To moze pokaze :)

?php

			function Formularz($s)
	  {
	   $s  = "<form ACTION=".$_SERVER['SCRIPT_NAME']." method='post'>";
		$s .= "<input TYPE='text' name='fraza'>";
		$s .= "<input TYPE='submit' value='szukaj'>";
		 return $s;
	  };

	      if(!function_exists('SearchWords'))
			{
			function SearchWords($fi,$c,$f)
	  {
	    $foo = file($c.'/'.$fi);

			   $match = 0;

				for($tmp=0;$tmp<count($foo);$tmp++)
		 {

				 list($link, $opis ,$klucze) = explode('|', $foo[$tmp]);


				 $ex = explode(',', trim($klucze));

				
			 
			 for($i=0; $i<count($ex); $i++){
			 
			 if(strstr($ex[$i], $f))
			 {
			 
			 $add = $ex[$i] . " ";
			 
			 print $link . "<br />";
			 print $opis . "<br />";
			 echo str_replace($f, "<font color=red>".$f."</font>", $add) . "<br /><br />";
			 
			 $match++;
			 }
			 
			 }


}







       print '<a href=' . $_SERVER['SCRIPT_NAME'] . '>zukaj ponownie</a><br />';
		 if($match == FALSE){

		 exit('Nie znalazlem <b><u>' . $f . '</u></b>');

		 }

		 };
};


	   (!@$_POST['fraza']) ? print Formularz(@$s) : SearchWords('baza.txt','katalog_do_pliku',$_POST['fraza']);
?>

Plik .txt

index.php|opis 1asas|klucz, klucz2, baba, klucz4a, kliii, kkikii
lol.php|opis 2|klucz1, klucz22, ce, dupa, klucz3, klucz78, mama, wwwww
asd1.php|opis 3|kl1, kl, olo, cez, marcelo, lolo, kl4, klucz222

Albo juz glupieje albo nie wiem co ;)

1
szybka_parowka napisał(a):

$string = "ala ma kota ale kota ma tez i basia i stasio wiec wszyscy maja zryta banie";

$s = "a";

Teraz jak wylapac wszystkie wyrazy majace w sobie "a" i je wyswietlic a te ktore nie maja zostaja pomniete.

Dla takich warunków zadania mogę zaproponować rozwiązanie bez żadnych pętli, na samych wyrażeniach regularnych:

$string = "ala ma kota ale kota ma tez i basia i stasio wiec wszyscy maja zryta banie";
$s = "a";

$string = ' ' .$string. ' ';
$pattern = '/([^ ]*' . $s . '[^ ]*)/i';
$replacement = '<$1>';
$string = preg_replace($pattern, $replacement, $string);

// echo ($string);
// echo("<br>");

$string =">$string<";
$pattern = '/(>[^<]*<)/i';
$replacement = ' ';
$string = preg_replace($pattern, $replacement, $string);

$string = trim($string);

echo ($string);

1 użytkowników online, w tym zalogowanych: 0, gości: 1