php - Deux expressions régulières ont des effets différents
ringa_lee
ringa_lee 2017-05-16 13:08:16
0
3
536

Correspond à la chaîne "abc 123". Demandez à retirer ABC et 123.

<?php $str = "abc 123" ; $preg = "/^(.*?)\s+(.*?)$/"; $preg1 = "/^(.*?)\s*(.*?)$/"; preg_match($preg, $str, $tmp); preg_match($preg1, $str, $tmp1); echo '<pré>'; print_r($tmp); print_r($tmp1); echo '</pre>'; // $tmp Tableau ( [0] => [1] => [2] => 123 ) // $tmp1 Tableau ( [0] => [1] => [2] => )

Pourquoi les résultats de correspondance sont-ils différents ? Y a-t-il quelque chose auquel je dois prêter attention ?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(3)
伊谢尔伦

Aucun des deux premiers étudiants n’a répondu sur ce point.
Laissez-moi y répondre,

Le vrai secret réside dans les règles du matching paresseux (ou non gourmand) :

惰性(或叫非贪婪)匹配的规则:

星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。

  1. /(.*?)s+/,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。

  2. /(.*?)s*/Un astérisque ou un signe plus suivi d'un point d'interrogation indique une correspondance paresseuse, ce qui signifie une correspondance le moins possible.

    1. /(.*?)s+/, le signe plus indique que la correspondance précédente (c'est-à-dire l'espace s) apparaît une ou plusieurs fois. Ce paragraphe signifie correspondre le moins possible, suivi d'au moins un espace s. En regardant les choses de cette façon, la parenthèse précédente peut correspondre à abc.
    🎜
  3. 🎜/(.*?)s*/, l'astérisque indique que la correspondance précédente (c'est-à-dire l'espace s) apparaît 0 fois ou plus. Le sens de ce paragraphe est de correspondre le moins possible, et il ne peut y avoir rien après (s*). Cela donne une chaîne vide, ne correspondant à rien. 🎜🎜 🎜
阿神

Veuillez noter que les résultats des jokers réguliers s+ et s* sont nettement différents.
"*" Correspond à la sous-expression précédente zéro ou plusieurs fois. Par exemple, zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
"+" correspond à "z" et "zoo".

équivaut à {0,}.

"+" Correspond à la sous-expression précédente une ou plusieurs fois. Par exemple, « zo+ » correspond à « zo » et « zoo », mais pas à « z ». + équivaut à {1,}. /^(.

?)s+(.

?)$/

Le "/" devant et le "/" à l'arrière indiquent que le début et la fin n'ont aucune signification pratique.
Le premier "^" signifie correspondre au début du texte
() est la priorité de gauche à droite "." signifie correspondre à n'importe quel caractère, "*" signifie correspondre plus de 0 fois

Le premier crochet signifie correspondre à tous les caractères, " ?" Correspondance non gourmande, ce qui signifie faire correspondre le caractère ou la sous-expression précédent zéro ou une fois.

s est n'importe quel caractère d'espacement

🎜Je vous recommande un tutoriel pour apprendre : introduction de 30 minutes aux expressions régulières🎜
PHPzhong

Corrigez la réponse, cela est dû à une correspondance paresseuse, qui est également l'une des difficultés de l'expression régulière.

La soi-disant correspondance paresseuse peut être comprise de manière populaire : si vous ne lui dites pas qu'il y a quelque chose devant lui, il ne fonctionnera pas. Dans la première règle régulière, vous lui dites d'avancer et de s'arrêter lorsqu'il rencontre au moins un espace pour le compter comme une correspondance.
La deuxième règle habituelle, vous lui dites d'avancer, il n'a pas besoin de rencontrer d'espaces ou il peut compter comme une correspondance s'il rencontre des espaces. Il est très paresseux et s'arrête simplement de bouger, sans rien correspondre.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal