PHP preg_match不适用于新行

时间:2016-03-22 14:58:49

标签: php regex

我有这个很好的preg_match正则表达式:

if(preg_match ("%^[A-Za-z0-9ążśźęćń󳥯ŚŹĘĆŃÓŁ\.\,\-\?\!\(\)\"\ \/\t\/\n]{2,50}$%", stripslashes(trim($_POST['x']))){...}

哪个字符应该允许在帖子中使用的所有字符和最终的文本内容。问题是,尽管 \ n 它的功能仍然不适用于我的帖子中的新行,所以语法为

  

FOO

     

无效。 有人知道为什么函数不能正常工作吗?

感谢任何帮助。

1 个答案:

答案 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你回答说它有效,我想知道这个问题究竟是什么。