[REGEX] Ophalen van woorden om keyword hee

Gestart doorRik7 reacties63 weergaven

8 berichten · pagina 1 van 1

Rik

Lid · Topicstarter

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Hi!

Ik ben (nog steeds) bezig met een applicatie op mijn stage, en nu moet ik een reguliere expressie hebben die naast een bepaalde keyword x woorden op moet halen.

Voor het ogenblik nemen we even de volgende waardes:
Zin: "Dit is een zin waar one2xs in staat, het maakt mij niet uit of de keyword One2xs er met hoofdletters of kleine letters in staat. Je moet dus ook ONE2XS kunnen schreeuwen!"
Keyword: one2xs
woorden omheen: 2

Wat de reguliere expressie als resultaat moet hebben is:

array
[0] zin waar one2xs in staat
[1] de keyword One2xs er met
[2] dus ook ONE2XS kunnen schreeuwen


Ik heb de volgende regex die BIJNA werkt zoals ik wil, maar niet de goede resultaten terug geeft:

/((w*W*){2})( . $tKeyword . )((w*W*){2})/i


Wie mij het winnende antwoord geeft krijgt iets kleins smile

- Rik
0
Berichten
6.144
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Welke resultaten geeft de expressie die je nu hebt terug?
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Gebruik de /g flag en /i flag

/((w*W*){2})(one2xs)((w*W*){2})/ig


http://www.regexr.com/39jh1
0
Berichten
6.144
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Kwam er net inderdaad ook achter @dylanh, haha.
0
Rik

Lid · Topicstarter

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Probleem is inmiddels opgelost. Hetgeen ik vergeten was te doen was "PREG_PATTERN_ORDER" als parameter aan de functie mee te geven. Toen kreeg ik opeens alle resultaten mooi achter elkaar om wat voor vage reden.

De code van dylan werkt denk ik ook wel, die verschilt verder niet heel veel (enkel de /g flag erbij).
0
Rik

Lid · Topicstarter

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
BUMP

De code die ik nu gebruikt werkt, maar omdat ik met grote hoeveelheden content zit, en ik ook meerdere rows door moet zoeken duurt de preg_match_all ontzettend lang. Het verschil tussen wel en niet preg_match gebruiken is bijna 8 seconden of meer.

Codeblok (voorbeeld.php):

1
2
3
4
5
6
7
8
9
10

/**
* Extracts and highlights all keywords in a given text, and returns the stubs which contain the keywords
* @param type $pText The text to extract the stubs from
* @param type $pKeywords The array of keywords to look for
* @param type $pCharsBeforeAndAfter The number of words need to be on each side of the keyword
* @return type Array of keyword stubs
*/

function extractAndHighlight($pText, $pKeywords, $pCharsBeforeAndAfter) {
$regex = /((w*W*){ . $pCharsBeforeAndAfter . })(?: . implode("|", $pKeywords) . )((w*W*){ . $pCharsBeforeAndAfter . })/i;
preg_match_all($regex, $pText, $matches, PREG_PATTERN_ORDER);
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Kun je niet gewoon met explode alles in woorden opdelen, dan checken wat de keys van je matches zijn, en dan de matches met key-2 t/m key+2 weergeven?

Dan gebruik je geen preg_match, geen idee of je dat per se wil, maar kun je het misschien wel sneller krijgen.

Al zou een preg_match oplossing natuurlijk wel netter zijn.
0
Rik

Lid · Topicstarter

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Lennard schreef:
Kun je niet gewoon met explode alles in woorden opdelen, dan checken wat de keys van je matches zijn, en dan de matches met key-2 t/m key+2 weergeven?

Dan gebruik je geen preg_match, geen idee of je dat per se wil, maar kun je het misschien wel sneller krijgen.

Al zou een preg_match oplossing natuurlijk wel netter zijn.
Aan zoiets dacht ik inderdaad ook. Het verschil tussen wel en geen regex gebruiken is bijna 18 seconden als ik wel een regex gebruik. Maar keyword extraction is gewoon een must..

En sommige bestanden bestaan uit meer dan 5000 woorden. Ik betwijfel dus of exloden op spaties gaat werken emo
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren