<?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();
?>
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?
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.
Bedankt, Robbie, Ariën en Ozzie - vooral Ozzie! Met die info kom ik er wel. Nee, correctie: met die info bén ik er :-) . Heel fel bedankt!
[size=xsmall]Toevoeging op 30/06/2020 14:29:10:[/size]
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?
\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
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 ;-) ).
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 ;-) ).
<?php
$text = 'In de-ze zin staan re-dè-lijk wat woor-den met split-Sings-streep-jes, zou u ook niet zeg-gen?';
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.
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.