[PHP] preg_match terreur

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een zoekmachine aan het schrijven voor een website. De zoekmachine accepteert losse woorden en zinsdelen die gegroepeerd zijn d.m.v. " tekens. Net als Google dus. Nou converteert mijn script de query naar een array met die woorden en/of zindelen.

Vervolgens wordt er een vergelijking gedaan in de database en wil ik de eerste zin waarin het woord voorkomt extraheren en tonen in de zoekresultaten. Ik had de volgende reguliere expressie (en veel varianten) geschreven maar dat leek geen succes:

PHP:
1
2
3
4
5
6
7
function getChunks($body) {
    $chunks = "";
            
    foreach($this->aQuery as $queryPart) {
        preg_match_all("/[A-Z]*.*\b$queryPart\b.*[\.]*/mU", $body, $aMatches);
    }
}


Zoals je aan de $this-notatie kunt zien is de functie deel van een class. Verder ziet de regexp er zo freaky uit dat ik niet verwachtte dat-ie zou werken, maar anders wist ik het niet. Punt is dat de body kan variëren van:

"QueryPart"

tot:

"In deze zin staat de querypart die we zoeken."

Het volgende probleem is de plaatselijke case-insensitivity, want een zin herken je doorgaans aan de eerste hoofdletter. Een voorafgaande punt is er niet altijd :/

[ Voor 4% gewijzigd door Verwijderd op 22-02-2005 22:18 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een hoofdletter is ook niet noodzakelijkerwijs het begin van een zin. ;)

PHP:
1
preg_match_all("/[A-Z][a-z]*\b$queryPart\b[^.]*\./mU", $body, $aMatches);

Ik denk dat dat al meer in de buurt komt van wat je hebben wil, maar ik heb hem niet getest. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is 'm geworden. Heeft een halfuurtje harentrekken gekost, maar dan heb je ook wat ;)

PHP:
1
preg_match("/(\.|\A)+(.*)$queryPart(.*)(\.|\Z)+/miU", $body, $aMatch);

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom die haakjes om .* heen steeds? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.