Avatar billede bahn Nybegynder
14. marts 2011 - 17:10 Der er 11 kommentarer og
1 løsning

reg exp hjælp til søge funktion

Hej jeg har et problem når nogen skal finde varer i min webshop.

nogle gange står der plæneklipper klipper i databasen nogle gange står der plæneklipper.

kan i hjælpe mig med at lave en funktion der, når man søger på plæneklipper både bliver søgt på plæneklipper og plæneklipper?

indtilvidere har jeg prøvet med:
    $search_post = ereg_replace("æ","%",$_POST[search]);
    $search_post = ereg_replace("ø","%",$search_post);
    $search_post = ereg_replace("å","%",$search_post);
    $search = explode(" ", $search_post);
og det det giver jo selvfølgelig en del forkerte resultater i søgningen især når man eks skriver "blæser"
kommer dette resultet jo frem "...Passer bl.a på Husqvarna og Jonsered med ..."

er der ikke en der er sej til reg exp der kan komme med et bud
Avatar billede xicrow Nybegynder
15. marts 2011 - 22:31 #1
Hej bahn.

Jeg er ikke helt med på hvad det er du vil opnå.

Først skriver du at der nogle gange i din database står "plæneklipper klipper" og andre gange "plæneklipper".

Derefter vil du have hjælp til at der ved søgning på "plæneklipper" både bliver søgt på "plæneklipper" og "plæneklipper" (hvad er lige forskellen).

Derudover så er det slet ikke nødvendigt at bruge RegEx til det du har indtil videre, da du bare kan bruge str_replace():
$search_post = str_replace(array('æ', 'ø', 'å'), '%', $_POST['search']);

Hvis du forklare lidt nærmere hvad det er du vil opnå, så er jeg sikker på at vi bedre kan hjælpe dig.

/xicrow
Avatar billede bahn Nybegynder
16. marts 2011 - 08:02 #2
hej

det kan jeg godt forstå du har lidt svært ved der er også noget lort jeg har skrevet.

ordet plæneklipper kan både opstå som:
plæneklipper  og
pl & a e lig; neklipper (skrevet lidt mærkeligt da denne side laver æ og til æ)

så jeg vil gerne have at hvis man søger på plæneklipper
at den laver søgestrengen om så den både inde holder plæneklipper og pl& a e l i g ; neklipper og selvfølgelig og ø og å

var det lidt bedre?
Avatar billede xicrow Nybegynder
16. marts 2011 - 19:04 #3
Det var meget bedre :)

Du kan egentligt bruge det jeg har skrevet i min først kommentar, og laver noget lignende:
[code]// Hent søgestreng fra POST
$search_post = $_POST['search'];

// Array med hvad der skal søges efter og hvad det skal erstattes med
$s_r = array(
    "æ" => "& aelig ;", // Fjern lige mellemrum
    "ø" => "& oslash ;", // Fjern lige mellemrum
    "å" => "& aring ;", // Fjern lige mellemrum
);

// Lav en modificeret søge streng
$search_post_modified = str_replace(array_keys($s_r), array_values($s_r), $search_post);

// SQL til søgning
$sql = '
select *
from TABEL_NAVN
where (FELT_NAVN like "%'.$search_post.'%" or FELT_NAVN like "%'.$search_post_modified .'%"
order by FELT_NAVN asc;';[/code]


Ovenstående ser noget sjovt ud, men jeg håber du forstår, da jeg ikke lige kan få det til at spille med Eksperten.

Det vil resultere i at du søger på både "plæneklipper" og "pl& aelig ;neklipper" (uden mystiske mellemrum selvfølgelig).

/xicrow
Avatar billede bahn Nybegynder
17. marts 2011 - 10:53 #4
tak for forslag
jeg kan ike få det til at virke hvad har jeg gjort galt:
$search_post = $_POST[search];

// Array med hvad der skal søges efter og hvad det skal erstattes med
$s_r = array("æ" => "æ", // Fjern lige mellemrum
    "ø" => "ø", // Fjern lige mellemrum
    "å" => "å",
    "Æ" => "Æ", // Fjern lige mellemrum
    "Ø" => "Ø", // Fjern lige mellemrum
    "Å" => "Å", // Fjern lige mellemrum
);

// Lav en modificeret søge streng
$search_post .= " ". str_replace(array_keys($s_r), array_values($s_r), $search_post);

når jeg ændre æ til test kan jeg se at den erstatter men den skriver æ som intet var hendt (også i kildekoden)
Avatar billede bahn Nybegynder
17. marts 2011 - 12:36 #5
ja det jeg har sendt ind giver det jo god mening at det ikke virker!!

men der står nu & ae lig; der hvor der skal
Avatar billede xicrow Nybegynder
17. marts 2011 - 12:44 #6
Det skulle gerne være:
$search_post = $_POST[search];

// Array med hvad der skal søges efter og hvad det skal erstattes med
$s_r = array(
    "æ" => "& aelig ;", // Fjern lige mellemrum
    "ø" => "& oslash ;", // Fjern lige mellemrum
    "å" => "& aring ;", // Fjern lige mellemrum
    "Æ" => "& Aelig ;", // Fjern lige mellemrum
    "Ø" => "& Oslash ;", // Fjern lige mellemrum
    "Å" => "& Aring ;", // Fjern lige mellemrum
);

// Lav en modificeret søge streng
$search_post .= " ". str_replace(array_keys($s_r), array_values($s_r), $search_post);


Du kan så teste det ved at lave:
var_dump($search_post);
echo '<br />';
var_dump($search_post_modified);


Eller efter din $sql:
echo '<pre>'.$sql.'</pre>';


Prøv evt. at lade mellemrummene stå i det array der erstatter, da "& aelig ;" (uden mellemrum) jo bliver til "æ" når det bliver vidst i en browser.

Så hvis du først prøver at erstatte med "& aelig ;" (med mellemrum) så kan du nemmere se om de bliver erstattet.

/xicrow
Avatar billede xicrow Nybegynder
17. marts 2011 - 12:50 #7
Altså hvis du prøver at lave:
// Hent søgestreng fra POST
$search_post = $_POST['search'];

// Array med hvad der skal søges efter og hvad det skal erstattes med
$s_r = array(
    "æ" => "& aelig ;",
    "ø" => "& oslash ;",
    "å" => "& aring ;",
);

// Lav en modificeret søge streng
$search_post_modified = str_replace(array_keys($s_r), array_values($s_r), $search_post);

// SQL til søgning
$sql = '
select *
from TABEL_NAVN
where (FELT_NAVN like "%'.$search_post.'%" or FELT_NAVN like "%'.$search_post_modified.'%"
order by FELT_NAVN asc;';

echo '<pre>'.$sql.'</pre>';
exit;


Så skulle du gerne få:
select *
from TABEL_NAVN
where (FELT_NAVN like "%plæneklipper%" or FELT_NAVN like "%pl& aelig ;neklipper%"
order by FELT_NAVN asc;


Når du så fjerner mellemrummene i søg og erstat array'et, vil den skrive:
select *
from TABEL_NAVN
where (FELT_NAVN like "%plæneklipper%" or FELT_NAVN like "%plæneklipper%"
order by FELT_NAVN asc;


Da din browser erstatter "& aelig ;" (uden mellemrum) med "æ", men forespørgslen den sender til databasen, er stadig korrekt og der vil blive søgt på både "æ" og "& aelig ;" (uden mellemrum)

/xicrow
Avatar billede bahn Nybegynder
21. marts 2011 - 10:31 #8
erstatningen virker fint

jeg skal lige have arbejdet lidt med sql queryen da der jo godt kan søges på flere ord og jeg gerne vil have ande på de ander ord og or på hvis der er flere "udgaver af det samme ord"
Avatar billede bahn Nybegynder
21. marts 2011 - 10:32 #9
lig gerne et svar
Avatar billede xicrow Nybegynder
21. marts 2011 - 19:28 #10
Og et svar får du her

/xicrow
Avatar billede bahn Nybegynder
28. marts 2011 - 11:12 #11
$s_r = array(
    "æ" => "&aelig;",
    "ø" => "&oslash;",
    "å" => "&aring;",
    "Æ" => "&AElig;",
    "Ø" => "&Oslash;",
    "Å" => "&Aring;",
);

foreach($s_r as $key => $aeo)
        {
        $mystring = $value;
        $findme  = $key;
        $pos = strpos($value, $aeo);

        // Note our use of ===.  Simply == would not work as expected
        // because the position of 'a' was the 0th (first) character.
        if ($pos === false)
            {
            echo "The string '$findme' was not found in the string '$mystring'<br>\n";
            }
        else
            {
            echo "The string '$findme' was found in the string '$mystring'";
            echo " and exists at position $pos<br>\n";
            }
        }

printer dette:

The string 'æ' was not found in the string 'plæneklipper'
The string 'ø' was not found in the string 'plæneklipper'
The string 'å' was not found in the string 'plæneklipper'
The string 'Æ' was not found in the string 'plæneklipper'
The string 'Ø' was not found in the string 'plæneklipper'
The string 'Å' was not found in the string 'plæneklipper'

især den øverste streng undre mig!!!
Avatar billede bahn Nybegynder
28. marts 2011 - 11:38 #12
jeg havde stiret mig totalt blind

her var min løsning

foreach($s_r as $key => $aeo)
        {
        $fundet = 0;
        $mystring = $value;
        $findme  = $key;
        $pos = strpos($mystring, $findme);

        // Note our use of ===.  Simply == would not work as expected
        // because the position of 'a' was the 0th (first) character.
        if ($pos === false)
            {
            echo "The string '$findme' was not found in the string '$mystring'<br>\n";
            }
        else
            {
            echo "The string '$findme' was found in the string '$mystring'";
            echo " and exists at position $pos<br>\n";
            $ny_value = str_replace($findme, $s_r[$findme], $mystring);
            $fundet = 1;
            }
        if ($fundet == 1)
            {
            $query .= "\n OR (model like '%$ny_value%'";
            $query .= " or brand like '%$ny_value%'";
            $query .= " or `type` like '%$ny_value%'";
            $query .= " or engine like '%$ny_value%'";
            $query .= " or varenummer like '%$ny_value%')";
            }
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Dynamicweb Software A/S

Marketing Intern (DK)

Udviklings- og Forenklingsstyrelsen

Systemejer med teknisk flair

Udviklings- og Forenklingsstyrelsen

Stærk IT-profil med souschef-potentiale

Dynamicweb Software A/S

Tech Team Lead