web-dev-qa-db-fra.com

comment utiliser preg_split () en php?

Quelqu'un peut-il m'expliquer comment utiliser la fonction preg_split ()? Je n'ai pas compris le paramètre de modèle comme celui-ci "/[\s,]+/".

par exemple:

J'ai ce sujet: is is. et je veux que les résultats soient:

array (
  0 => 'is',
  1 => 'is',
)

il ignorera donc l'espace et le point final, comment puis-je faire cela?

10
MD.MD

preg signifie Pcre REGexp ", ce qui est en quelque sorte redondant, car le" PCRE "signifie" Perl Compatible Regexp ".

Les regexps sont un cauchemar pour le débutant. Je ne les comprends toujours pas pleinement et je travaille avec eux depuis des années.

Fondamentalement, l'exemple que vous avez là-bas, ventilé est:

"/[\s,]+/"

/ = start or end of pattern string
[ ... ] = grouping of characters
+ = one or more of the preceeding character or group
\s = Any whitespace character (space, tab).
, = the literal comma character

Vous avez donc un modèle de recherche qui est "divisé sur n'importe quelle partie de la chaîne qui est au moins un espace blanc et/ou une ou plusieurs virgules".

D'autres caractères communs sont:

. = any single character
* = any number of the preceeding character or group
^ (at start of pattern) = The start of the string
$ (at end of pattern) = The end of the string
^ (inside [...]) = "NOT" the following character

Pour PHP il y a de bonnes informations dans la documentation officielle .

32
Majenko

Cela devrait fonctionner:

$words = preg_split("/(?<=\w)\b\s*[!?.]*/", 'is is.', -1, PREG_SPLIT_NO_EMPTY);

echo '<pre>';
print_r($words);
echo '</pre>';

La sortie serait:

Array
(
    [0] => is
    [1] => is
)

Avant d'expliquer l'expression régulière, juste une explication sur PREG_SPLIT_NO_EMPTY. Cela signifie essentiellement que renvoyer les résultats de preg_split si les résultats ne sont pas vides. Cela vous assure que les données renvoyées dans le tableau $words Contiennent vraiment des données et pas seulement des valeurs vides qui peuvent se produire lorsque vous traitez avec des modèles d'expression régulière et des sources de données mixtes.

Et l'explication de cette expression régulière peut être décomposée comme ceci en utilisant cet outil :

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    \w                       Word characters (a-z, A-Z, 0-9, _)
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  \b                       the boundary between a Word char (\w) and
                           something that is not a Word char
--------------------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  [!?.]*                   any character of: '!', '?', '.' (0 or more
                           times (matching the most amount possible))

Une meilleure explication peut être trouvée en entrant le modèle regex complet de /(?<=\w)\b\s*[!?.]*/ dans cet autre autre outil :

  • (?<=\w) Lookbehind positif - Affirmez que l'expression régulière ci-dessous peut être mise en correspondance
  • \w Correspond à n'importe quel caractère Word [a-zA-Z0-9_]
  • \b Affirme la position à la limite d'un mot (^\w|\w$|\W\w|\w\W)
  • \s* correspond à n'importe quel caractère d'espace blanc [\r\n\t\f ]
  • Quantificateur: Entre zéro et un nombre illimité de fois, autant de fois que possible, en redonnant au besoin [gourmand]
  • !?. Un seul caractère de la liste !?. Littéralement

Cette dernière explication regex peut être résumée par un humain - également connu sous le nom de moi - comme suit:

Faites correspondre - et divisez - tout caractère Word précédant une limite Word pouvant avoir plusieurs espaces et les signes de ponctuation de !?..

7
JakeGould

La documentation dit:

La fonction preg_split () fonctionne exactement comme split (), sauf que les expressions régulières sont acceptées comme paramètres d'entrée pour le modèle.

Donc, le code suivant ...

<?php

$ip = "123 ,456 ,789 ,000"; 
$iparr = preg_split ("/[\s,]+/", $ip); 
print "$iparr[0] <br />";
print "$iparr[1] <br />" ;
print "$iparr[2] <br />"  ;
print "$iparr[3] <br />"  ;

?>

Cela produira le résultat suivant.

123
456
789
000 

Donc, si vous avez ce sujet: is is et vous voulez: tableau (0 => 'est', 1 => 'est',)

vous devez modifier votre expression régulière en "/[\s]+/"

Sauf si vous avez is ,is vous avez besoin de l'expression régulière que vous avez déjà "/[\s,]+/"

1
Federico Piazza

Le PHP str_Word_count peut être un meilleur choix ici.

str_Word_count($string, 2) affichera un tableau de tous les mots de la chaîne, y compris les doublons.

1
ceejayoz