Alle woorden met "-"

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Eric Verboven

Eric Verboven

30/06/2020 12:30:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


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!
 
PHP hulp

PHP hulp

26/09/2020 00:43:22
 
- Ariën -
Beheerder

- Ariën -

30/06/2020 12:35:31
Quote Anchor link
Je wilt dus alle woorden tussen streepjes en spaties ophalen?
 
Rob Doemaarwat

Rob Doemaarwat

30/06/2020 13:00:35
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

30/06/2020 13:35:10
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

?>

Zoiets ... wat Rob hierboven zegt kan ook.
 
Eric Verboven

Eric Verboven

30/06/2020 14:21:09
Quote Anchor link
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!

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?
 
Rob Doemaarwat

Rob Doemaarwat

30/06/2020 15:56:48
Quote Anchor link
Die uitleg wil ik ook wel even doen ;-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
Ozzie PHP

Ozzie PHP

30/06/2020 19:01:05
Quote Anchor link
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 ;-) ).


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

?>

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.
 
Rob Doemaarwat

Rob Doemaarwat

30/06/2020 19:13:54
Quote Anchor link
Het kan nog wel een stukje simpeler:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
/\w+(-\w+)+/u
(en dan gewoon de $matches[0] als output) -> https://regex101.com/r/cWliO8/1
 
Eric Verboven

Eric Verboven

30/06/2020 19:22:04
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

30/06/2020 22:30:13
Quote Anchor link
Da's inderdaad nog korter Rob!

@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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.