Alle woorden met "-"
Code (php)
1
2
3
4
2
3
4
<?php
$zin = "In de-ze zin staan re-de-lijk wat woor-den met split-sings-streep-jes, zou u ook niet zeg-gen?";
$woorden_met_streepjes = array();
?>
$zin = "In de-ze zin staan re-de-lijk wat woor-den met split-sings-streep-jes, zou u ook niet zeg-gen?";
$woorden_met_streepjes = array();
?>
Hoe haal ik (met PHP) uit een string_groot alle string_kleiners die een string_heel_klein bevatten? Of, zoals hierboven: hoe vind ik in bovenstaande zin alle woorden (woorden dus) met streepjes?
Met de vertrouwde str-functies kom ik er niet. Ik vermoed dat het met een regex zou moeten, maar laat dat nou net het meest moerassige deel van mijn PHP-kennis zijn... Kan iemand me helpen met een stukje werkende code?
Met dank!
Je wilt dus alle woorden tussen streepjes en spaties ophalen?
Eigenlijk hoeft dit niet eens met een regex. De tekst gewoon exploderen op een spatie, en dan die lijst doorlopen om te kijken of er een streepje in het woord staat (ja = bewaren). Ik zou dan wel meteen met een trim() evt. extra "leestekens" (punten, komma's, vraagtekens, enz) er af trimmen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$text = 'In de-ze zin staan re-de-lijk wat woor-den met split-sings-streep-jes, zou u ook niet zeg-gen?';
$pattern = '/\s?([a-z]+-[a-z]+(-[a-z]+)*)[\W]/';
preg_match_all($pattern, $text, $matches);
echo implode('<br>', $matches[1]);
// RESULTAAT:
de-ze
re-de-lijk
woor-den
split-sings-streep-jes
zeg-gen
?>
$text = 'In de-ze zin staan re-de-lijk wat woor-den met split-sings-streep-jes, zou u ook niet zeg-gen?';
$pattern = '/\s?([a-z]+-[a-z]+(-[a-z]+)*)[\W]/';
preg_match_all($pattern, $text, $matches);
echo implode('<br>', $matches[1]);
// RESULTAAT:
de-ze
re-de-lijk
woor-den
split-sings-streep-jes
zeg-gen
?>
Zoiets ... wat Rob hierboven zegt kan ook.
Toevoeging op 30/06/2020 14:29:10:
Vraagje voor Ozzie: kan je jouw $pattern ook in gewoon Nederlands uitdrukken? Bij een regex heb ik altijd de indruk dat ik plots een heel andere taal hoor. Concreet: hoe lees je jouw $pattern?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
\s? = optioneel een spatie ("white space") - om de regex te triggeren
vooraan te beginnen
( = groep 1 begint hier
[a-z]+ = 1 of meerdere letters
- = een streepje (dus matcht niet voor woorden zonder streepje)
[a-z]+ = 1 of meerdere letters
(-[a-z]+)* = nog 0 of meer groepen met "streepje + letters"
) = einde groep 1
[\W] = een "niet word* (= letter/cijfer/underscore)" karakter (om het einde
aan te duiden)
* in de Engelse context van het woord
vooraan te beginnen
( = groep 1 begint hier
[a-z]+ = 1 of meerdere letters
- = een streepje (dus matcht niet voor woorden zonder streepje)
[a-z]+ = 1 of meerdere letters
(-[a-z]+)* = nog 0 of meer groepen met "streepje + letters"
) = einde groep 1
[\W] = een "niet word* (= letter/cijfer/underscore)" karakter (om het einde
aan te duiden)
* in de Engelse context van het woord
Vervolgens vindt je dus in $matches[1] je woord-met-streepjes terug (het stuk binnen de eerste set haakjes)
Twee opmerkingen hierbij (daar was het me om te doen):
- Dit gaat mis met hoofdletters (matchen niet met [a-z]). Hiervoor moet je een "i" (case insensitive) achter de afsluitende "/" toevoegen (maar nog wel binnen de quotes).
- Dit gaat ook mis met "letters met accent" ("è", enz). Dat is wel een "e", maar dan net even anders, en matcht dus niet met [a-z]. Daarom kun je beter op de "niet white-space" toer (of dus gewoon die explode die ik al voorstelde ;-) ).
Gewijzigd op 30/06/2020 15:58:38 door Rob Doemaarwat
Rob Doemaarwat op 30/06/2020 15:56:48:
Twee opmerkingen hierbij (daar was het me om te doen):
- Dit gaat mis met hoofdletters (matchen niet met [a-z]). Hiervoor moet je een "i" (case insensitive) achter de afsluitende "/" toevoegen (maar nog wel binnen de quotes).
- Dit gaat ook mis met "letters met accent" ("è", enz). Dat is wel een "e", maar dan net even anders, en matcht dus niet met [a-z]. Daarom kun je beter op de "niet white-space" toer (of dus gewoon die explode die ik al voorstelde ;-) ).
- Dit gaat mis met hoofdletters (matchen niet met [a-z]). Hiervoor moet je een "i" (case insensitive) achter de afsluitende "/" toevoegen (maar nog wel binnen de quotes).
- Dit gaat ook mis met "letters met accent" ("è", enz). Dat is wel een "e", maar dan net even anders, en matcht dus niet met [a-z]. Daarom kun je beter op de "niet white-space" toer (of dus gewoon die explode die ik al voorstelde ;-) ).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$text = 'In de-ze zin staan re-dè-lijk wat woor-den met split-Sings-streep-jes, zou u ook niet zeg-gen?';
$pattern = '/\s?([\w]+-[\w]+(-[\w]+)*)[\W]/u';
preg_match_all($pattern, $text, $matches);
echo implode('<br>', $matches[1]);
// RESULTAAT:
de-ze
re-d-lijk
woor-den
split-Sings-streep-jes
zeg-gen
?>
$text = 'In de-ze zin staan re-dè-lijk wat woor-den met split-Sings-streep-jes, zou u ook niet zeg-gen?';
$pattern = '/\s?([\w]+-[\w]+(-[\w]+)*)[\W]/u';
preg_match_all($pattern, $text, $matches);
echo implode('<br>', $matches[1]);
// RESULTAAT:
de-ze
re-d-lijk
woor-den
split-Sings-streep-jes
zeg-gen
?>
En opgelost :)
Toevoeging op 30/06/2020 19:03:45:
Oh lekker ... bij het resultaat bij re-de-lijk wordt de e met accent niet weergegeven, maar die staat er wel gewoon. Foutje van phphulp blijkbaar.
(en dan gewoon de $matches[0] als output) -> https://regex101.com/r/cWliO8/1
Het kan nog wel een stukje simpeler: Wat moet het fijn zijn om vlotjes in het Regex te kunnen praten. Maar in ernst: allemaal heel fel bedankt. Ik ben goed opgeschoten, met jullie hulp, en ik heb wat bijgeleerd.
@Eric
Ik kan niet makkelijk in regex praten hoor. Maar als je bereid bent om je er in te verdiepen, kun je veel leren. In het begin snapte ik er niks van, maar als je er wat tijd aan besteedt wordt het een stuk duidelijker.