我有这个很好的preg_match正则表达式:
if(preg_match ("%^[A-Za-z0-9ążśźęćń󳥯ŚŹĘĆŃÓŁ\.\,\-\?\!\(\)\"\ \/\t\/\n]{2,50}$%", stripslashes(trim($_POST['x']))){...}
哪个字符应该允许在帖子中使用的所有字符和最终的文本内容。问题是,尽管 \ n 它的功能仍然不适用于我的帖子中的新行,所以语法为
FOO
巴
无效。 有人知道为什么函数不能正常工作吗?
感谢任何帮助。
答案 0 :(得分:3)
默认情况下,使用preg_match()
和^
模式的$
会考虑整个字符串,即使它包含换行符。
可以使用Pattern Modifiers更改此行为,其中我将列出适合此主题的行为:
s (PCRE_DOTALL)
:默认情况下,点(.
)将不匹配换行符,但通过使用修饰符s
,它会。但是,字符类(例如[a-z]
和[^a-z]
)从不将换行视为特殊字符,因此此修饰符不会影响它们的行为,就像它对点的影响一样( .
)。
m (PCRE_MULTILINE)
:默认情况下,start(^
)和end($
)锚点默认匹配整个字符串的开头和结尾模式匹配,甚至如果该字符串包含换行符。但是,当使用此修饰符时,允许preg-function将由换行符分隔的字符串的每个部分视为完整字符串,因此"foo\nbar\nbar"
将导致三个匹配项(1: foo, 2: bar, 3: bar
)与/^[a-z]$/m
模式匹配,而不是仅使用1: foo\nbar\bar
模式,而不使用m
修饰符:/^[a-z]$/
。
D (PCRE_DOLLAR_ENDONLY)
:默认情况下,结尾($
)锚点不仅会匹配字符串的最后一端,而且还会跟在尾随换行符之前(尾随意义:在此处)字符串的结尾)。要撤消此行为并使其非常严格仅匹配字符串结尾,请使用此模式修饰符。
您的问题:
if(preg_match("%^[A-Za-z0-9ążśźęćń󳥯ŚŹĘĆŃÓŁ\.\,\-\?\!\(\)\"\ \/\t\/\n]{2,50}$%m", stripslashes(trim($_POST['x']))){...}
我认为您的模式没有太大问题,除了您不需要转义\
,-
,^
以外的字符(仅限于字符类)和]
(仅当字符类开头不时),但PHP文档说它仍然不违反。
但是,您的文字片段可能包含\r\n
形式的换行符,并且由于\r
未包含在您的模式的字符类中,因此不会匹配。
由于我原来的帖子提到使用了Pattern Modifier m
你回答说它有效,我想知道这个问题究竟是什么。