2017-06-10 3 views
2

préanalyse je l'expression suivante:Faire insensible à la casse de négatif

$exp = "/^(?!.*?that).*$/"; 

qui est censé correspondre à une ligne qui ne contient pas « que ».

I ont les trois phrases suivantes:

$str = array( 
    "I like this sentence.", #line1 
    "I like that sentence.", #line2 
    "I link THAT sentence." #line3 
); 

La correspondance est sensible à la casse, et donc que les lignes 1 et 3 sont mis en correspondance. Jusqu'ici tout va bien.

Cependant, je voudrais rendre insensible à la casse, de sorte qu'il correspond uniquement à la ligne 1. J'ai essayé avec un modificateur en ligne, à savoir « (... -i?) »:

$exp = "/^(?!.*?(?i:that)).*$/"; 

et comme un drapeau, à savoir "/ .../i":

$exp = "/^(?!.*?that).*$/i"; 

mais en vain.

Je lancer la recherche avec la boucle suivante:

foreach($str as $s) { 
    preg_match_all($exp, $s, $matches); 
    var_dump($matches); 
} 

avec sortie:

array (size=1) 
    0 => 
    array (size=1) 
     0 => string 'I like this sentence.' (length=21) 
array (size=1) 
    0 => 
    array (size=0) 
     empty 
array (size=1) 
    0 => 
    array (size=1) 
     0 => string 'I link THAT sentence.' (length=21) 

et une démonstration en ligne est disponible ici: https://regex101.com/r/bs9rzF/1

Je voudrais remercier pour tous les conseils sur comment je peux rendre mon expression régulière insensible à la casse.

EDIT: J'utilisais incorrectement "? -i" au lieu de "? -i", comme certains contributeurs le signalent correctement. Fixé maintenant

+1

'$ exp ="/^(?!.*? Cela). * $/I ";' est correct et devrait fonctionner. Cependant, '(? -i: ...' désactive le modificateur i. Pour l'activer: '(? I: ...' –

+1

Votre deuxième essai avec '$ exp ="/^(?!.??). * $/i ";' [** devrait fonctionner. **] (https://3v4l.org/sEXhn) – revo

+0

En effet, il semble que le problème qui a rendu la recherche sensible à la casse indépendamment du modificateur i était quelque part else: le drapeau de u est également nécessaire pour les langues avec des accents et d'autres alphabets, c'est-à-dire "//((!!.*?)". * $/ui "' Merci pour vos réponses rapides! – msoutopico

Répondre

2

Votre première expression régulière ^(?!.*?that).*$ n'a rien à voir avec la sensibilité à la casse car vous n'utilisez aucun modificateur pour l'insensibilité à la casse.

Le regex correspond à la première et troisième phrase parce que votre regex dit qu'il y ne devrait pas être un motthat (cas ici sensible) dans la phrase, ce qui est vrai pour la première et troisième phrase (En troisième phrase vous avez qUE qui n'est pas identique à que)

corresponde uniquement la première phrase, vous pouvez utiliser le modificateur en ligne (?i) comme

(?i)^(?!.*?that).*$ 

Voir here

BTW, votre /^(?!.*?that).*$/i regex est également correcte.

2

Vous étiez proche:

^(?!.*?(?i)that).*$ 

Voir a demo on regex101.com. Dans votre expression ((?-i)), vous avez activé le modificateur sur.