[PHP] Jak znaleźć duplikaty w tekście?

W tym wpisie stworzymy prostą klasę obsługującą sprawdzanie czy w tekście są powtarzające się słowa. Klasa o nazwie SD (search duplicates) będzie zawierała dwie istotne metody:

  • search_duplicates - metoda wyszukująca powtarzające się słowa;
  • mark_duplicates - metoda zaznaczająca duplikaty w tekście wybranym lub domyślnym kolorem;

W metodzie search_duplicates do rozbicia tekstu na poszczególne wyrazy użyta zostanie funkcja preg_split z prostym wyrażeniem regularnym rozdzielającym słowa po spacji, przecinku i kropce.

Klasa SD

<?php

class SD {
	
	public $text;
	public $duplicates = [];
	public $color = '#FFEA00';
	
	function __construct($text) {
		
		$this->text = $text;
		
	}
	
	public function search_duplicates() {
		
		$words = preg_split('/[\s,.]+/', $this->text);
		$count_values = array_count_values($words);
		$i = 0;
		
		foreach($count_values as $key => $value) {
			
			if($value > 1) {
				
				$this->duplicates[$i] = [$key, $value];
				$i++;
				
			}
			
		}
		
		return $this->duplicates;
		
	}
	
	public function mark_duplicates($color = '') {
		
		$this->color = $color == '' ? $this->color : $color;
		$patterns = [];
		
		foreach($this->duplicates as $value) {
			
			$patterns[]='/(' . $value[0] . ')\s{1}+/i';
			
		}
		
		return preg_replace($patterns, '<span style="color:' . $this->color . ';">${0}</span>', $this->text);
		
	}
	
}

Przykład użycia

<?php

$sd = new SD('Lorem ipsum dolor Lorem sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip Lorem ex dolore ea commodo consequat. Duis aute irure dolor in reprehenderit ex in voluptate velit esse cillum dolore eu fugiat nulla pariatur.');

$duplicates = $sd->search_duplicates();

foreach($duplicates as $value) {
	
	echo "{$value[0]} wystąpiło {$value[1]} razy<br />";
	
}

Zaznaczanie duplikatów w tekście kolorem

<?php

$sd = new SD('Lorem ipsum dolor Lorem sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip Lorem ex dolore ea commodo consequat. Duis aute irure dolor in reprehenderit ex in voluptate velit esse cillum dolore eu fugiat nulla pariatur.');

$duplicates = $sd->search_duplicates();

echo $sd->mark_duplicates();

Jak widać w powyższych przykładach tekst do sprawdzenia przekazany zostaje już na poziomie tworzenia obiektu. Następnie wywołana zostaje metoda search_duplicates, która przeszuka tekst względem duplikatów i zwróci ich listę (w postaci tablicy) wraz z liczbą wystąpień danego słowa.

W przypadku potrzeby zwrócenia tekstu z wyróżnionymi kolorem duplikatami słów należy skorzystać z metody mark_duplicates. Metoda ta zaznacza domyślnym kolorem lub kolorem użytkownika podanym jako argument dla niej wszystkie powtarzające się słowa.

Komentarze

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?