Búsqueda de palabras de búsqueda múltiple usando strpos

Me pregunto si alguien puede ayudarme con un pequeño problema que parece que no puedo solucionar: mi cabeza da vueltas en círculos en este momento …

Ok, tengo un archivo .txt con numerosas líneas de información. Estoy intentando hacer coincidir las palabras clave con esas líneas y mostrar una cierta cantidad de líneas coincidentes.

Junté este fragmento de script y, aunque funciona, solo coincide con una línea si las palabras están en el mismo orden que las palabras de búsqueda.

Por el momento como un ejemplo:

Palabras de búsqueda:

sombrero rojo

Líneas en archivo .txt:

este es mi sombrero rojo
mi sombrero es rojo
este sombrero es verde
esto es un pañuelo rojo
tu sombrero rojo es bueno

Como el guión es en este momento coincidirá y mostrará las líneas 1, 5

Sin embargo, me gustaría que coincida y muestre las líneas 1, 2 y 5.

Cualquier orden, pero todas las palabras deben estar presentes para que coincida.

He revisado muchas publicaciones aquí y en otras partes y entiendo que lo que se necesita es explotar la cadena y luego buscar cada palabra en un bucle, pero no puedo hacer que funcione, a pesar de intentar algunas formas diferentes, ya que solo devuelve el misma línea numerosas veces

Cualquier ayuda sería apreciada antes de perder el pelo que me queda 🙂

Aquí está el código que tengo funcionando actualmente: la variable de búsqueda ya está configurada:

<?php rawurldecode($search); $search = preg_replace('/[^a-z0-9\s]|\n|\r/',' ',$search); $search = strtolower($search); $search = trim($search); $lines = file('mytextfile.txt') or die("Can't open file"); shuffle($lines); $counter = 0; // Store true when the text is found $found = false; foreach($lines as $line) { if(strpos($line, $search) !== false AND $counter <= 4) { $found = true; $line = ' '.$line.'
'; echo $line; $counter = $counter + 1; } } // If the text was not found, show a message if(!$found) { echo $noresultsmessage; } ?>

Gracias de antemano por cualquier ayuda, aún estoy aprendiendo 🙂

Aquí está mi código:

 $searchTerms = explode(' ', $search); $searchCount = count($searchTerms); foreach($lines as $line) { if ($counter < = 4) { $matchCount = 0; foreach ($searchTerms as $searchWord) { if (strpos($line, $searchWord) !== false ) { $matchCount +=1; } else { //break out of foreach as no need to check the rest of the words if one wasn't found continue; } } if ($matchCount == $searchCount) { $found = true; $line = ' '.$line.'
'; echo $line; $counter = $counter + 1; } } }