stavo scrivendo un piccolo motore di ricerca per siti statici che fa pesante utilizzo delle espressioni regolari.
ho il seguente problema: non riesco a passare da keyword in stile google ad una stringa di pcre-pattern accettabile. in particolare non riesco a implementare le funzioni per non cercare solo parole intere e le keyword quotate.
Esempi:
keyword: ecco pippo
Codice PHP:
$pcre_pattern = "@(.+)\becco\bpippo\b(.+)@sUi"
keyword: "ecco pippo" "tizio caio"
Codice PHP:
$pcre_pattern = "@(.+)\becco\Wpippo\b(.+)(.+)\btizio\Wcaio\b(.+)sUi"
keyword: ecco "tizio caio"
Codice PHP:
$pcre_pattern = "@(.+)\becco\b(.+)(.+)\btizio\Wcaio\b(.+)@sUi"
keyword: @ecco "@tizio caio" (e così per tutti i caratteri non alfanumerici ad eccezione dello spazio)
Codice PHP:
$pcre_pattern = "@\@(.+)\becco\b(.+)(.+)@tizio\Wcaio\b(.+)@sUi"
le pcre_pattern sono corrette?
fino a mo' ho solo fatto un casotto, di cui riporto il log
(non mi aspetto che questo codice funzioni come richiesto, è solo il meno peggio che sono riuscito a fare )
Codice PHP:
function search__needle2regex($needle, $whole_words, $case_sensitive)
{
if ($whole_words) {
$a_pcre_pattern[] = "@\w(.+)@U";
$a_pcre_replace[] = "($0)(.+)";
}
$a_pcre_pattern[] = "@ @U";
$a_pcre_replace[] = "\\W";
if(preg_match_all("@\\\"(.+)\\\"@U", $needle, $matches)) {
$a_pcre_pattern[] = "@\\\"(.+)\\\"@U";
$a_pcre_replace[] = "(.+)$1(.+)";
}
$pcre_needle = preg_replace($a_pcre_pattern, $a_pcre_replace, $needle);
$pcre_needle = "@" . $pcre_needle . "@sU";
if (!$case_sensitive) { $pcre_needle .= "i"; }
return $pcre_needle;
}