par
tesmet » 08 nov. 2017, 10:33
Bonjour,
On peut faire sa propre classe de caractères avec les crochets [] donc [\p{Lu}\'] voudrait dire d'inclure les lettres majuscules et l'apostrophe que j'ai échappé pour éviter un possible conflit avec PHP. Par contre, en encadrant avec des \b on pourrait détecter une frontière de mot avec une lettre minuscule car la classe de caractère inclue autre chose que des majuscules.
Code : Tout sélectionner
echo htmlspecialchars(preg_replace('#\b[\p{Lu}\']{2,}\b#u', '<strong>$0</strong>', "D'ÉTAT s'MAIS's"));
// affichera <strong>D'ÉTAT</strong> s<strong>'MAIS'</strong>s
// car les frontières seraient détectées entre les s minuscules et les apostrophes
Si ce n'est pas bon j'irais probablement vers un groupe facultatif avec * après le premier \b
Code : Tout sélectionner
$regex = '#\b(\p{Lu}+[\' ])*\p{Lu}{2,}\b#u'; // j'ai ajouté un espace dans la classe de caractères
echo htmlspecialchars(preg_replace($regex, '<strong>$0</strong>', "D'ÉTAT s'MAIS's MOTS ENSEMBLES car AJOUT De l'ESPACE"));
// affichera <strong>D'ÉTAT</strong> s'<strong>MAIS</strong>'s <strong>MOTS ENSEMBLES</strong> car <strong>AJOUT</strong> De l'<strong>ESPACE</strong>
Mais pour être exact il est peut-être préférable de construire ses propres frontières. Pour le \b de gauche (?<!\pL) pour dire n'est pas précédé d'une lettre et (?=\p{Lu}) pour dire doit-être suivi d'une lettre majuscule. Le \b de droite sera l'inverse (?<=\p{Lu}) doit-être précédé d'une lettre majuscule et (?!\pL) n'est pas suivi d'une lettre majuscule
Code : Tout sélectionner
$regex = '#(?<!\pL)(?=\p{Lu})[\p{Lu}\' ]{2,}(?<=\p{Lu})(?!\pL)#u'; // j'ai ajouté un espace dans la classe de caractères
echo htmlspecialchars(preg_replace($regex, '<strong>$0</strong>', "D'ÉTAT s'MAIS's MOTS ENSEMBLES car AJOUT De l'ESPACE"));
// affichera <strong>D'ÉTAT</strong> s'<strong>MAIS</strong>'s <strong>MOTS ENSEMBLES</strong> car <strong>AJOUT</strong> De l'<strong>ESPACE</strong>
Bonjour,
On peut faire sa propre classe de caractères avec les crochets [] donc [\p{Lu}\'] voudrait dire d'inclure les lettres majuscules et l'apostrophe que j'ai échappé pour éviter un possible conflit avec PHP. Par contre, en encadrant avec des \b on pourrait détecter une frontière de mot avec une lettre minuscule car la classe de caractère inclue autre chose que des majuscules.
[code]echo htmlspecialchars(preg_replace('#\b[\p{Lu}\']{2,}\b#u', '<strong>$0</strong>', "D'ÉTAT s'MAIS's"));
// affichera <strong>D'ÉTAT</strong> s<strong>'MAIS'</strong>s
// car les frontières seraient détectées entre les s minuscules et les apostrophes
[/code]
Si ce n'est pas bon j'irais probablement vers un groupe facultatif avec * après le premier \b
[code]$regex = '#\b(\p{Lu}+[\' ])*\p{Lu}{2,}\b#u'; // j'ai ajouté un espace dans la classe de caractères
echo htmlspecialchars(preg_replace($regex, '<strong>$0</strong>', "D'ÉTAT s'MAIS's MOTS ENSEMBLES car AJOUT De l'ESPACE"));
// affichera <strong>D'ÉTAT</strong> s'<strong>MAIS</strong>'s <strong>MOTS ENSEMBLES</strong> car <strong>AJOUT</strong> De l'<strong>ESPACE</strong>
[/code]
Mais pour être exact il est peut-être préférable de construire ses propres frontières. Pour le \b de gauche (?<!\pL) pour dire n'est pas précédé d'une lettre et (?=\p{Lu}) pour dire doit-être suivi d'une lettre majuscule. Le \b de droite sera l'inverse (?<=\p{Lu}) doit-être précédé d'une lettre majuscule et (?!\pL) n'est pas suivi d'une lettre majuscule
[code]$regex = '#(?<!\pL)(?=\p{Lu})[\p{Lu}\' ]{2,}(?<=\p{Lu})(?!\pL)#u'; // j'ai ajouté un espace dans la classe de caractères
echo htmlspecialchars(preg_replace($regex, '<strong>$0</strong>', "D'ÉTAT s'MAIS's MOTS ENSEMBLES car AJOUT De l'ESPACE"));
// affichera <strong>D'ÉTAT</strong> s'<strong>MAIS</strong>'s <strong>MOTS ENSEMBLES</strong> car <strong>AJOUT</strong> De l'<strong>ESPACE</strong>
[/code]