Si la validation est toujours en cours sur le serveur (c'est ce que runat="server"
signifie, non?), La solution la plus simple est probablement d'utiliser cette regex:
(?s)^.*Content.*$
(?s)
active le mode Singleline
, ce qui permet au métacaractère .
de correspondre à tous les caractères , y compris les lignes. Si vous souhaitez l'exécuter sur le client aussi bien, utilisez ceci:
^[\s\S]*Content[\s\S]*$
C'est parce que JavaScript n'a pas d'équivalent pour le mode Singleline
(également connu sous le nom DOT_ALL
, DOTALL
, point-Correspondances- tous, unique ligne, ou mode /s
). Il ne reconnaît pas les modificateurs en ligne tels que (?s)
et (?i)
.
Attention aux constructions comme (.\s*)*
, où une expression de quantificateurs (*
, +
, etc.) est enfermé dans un groupe qui est lui-même commandé par un quantificateur. Si la regex ne parvient pas à trouver une correspondance immédiatement, elle revient en arrière et essaie de faire correspondre des chemins différents (c'est-à-dire en utilisant différentes parties de la regex pour correspondre aux différentes parties de la chaîne), ce qui peut coûter très cher. Cette regex est particulièrement mauvaise car .
et \s
peuvent correspondre à plusieurs des mêmes caractères, ce qui augmente considérablement le nombre de chemins qu'il doit explorer avant d'abandonner.
Le phénomène est généralement connu comme catastrophic backtracking, et il se manifeste habituellement dans les cas où il n'y a aucune possibilité d'une correspondance. Je m'attendrais à ce que votre validateur fonctionne correctement lorsque la séquence Content
est présente.
Par ailleurs, si vous voulez faire correspondre uniquement sur le mot complet Content
, vous devez ajouter des limites de mots, comme ceci:
(?s)^.*\bContent\b.*$
Cela permettra d'éviter les faux positifs sur les mots comme MalContent
et Contentious
. \b
fonctionne différemment selon les différentes saveurs de regex. Dans .NET, il est compatible Unicode sauf si vous spécifiez le mode ECMAScript
.En JavaScript, il est supposé reconnaître uniquement les lettres et chiffres ASCII en tant que caractères de mot; dans la plupart des navigateurs, il le fait, mais ne le prenez pas pour acquis.
Super réponse. J'ai utilisé l'option [\ s \ S] puisque je voulais qu'elle fonctionne aussi côté client (runat = "serveur" signifie que le serveur doit interpréter la balise, EnableClientScript = "false" ne l'exécuterait que sur le serveur) . – Eric