PHP preg_match 不适用于新行

aln*_*447 5 php regex

我有这个不错的 preg_match 正则表达式:

if(preg_match ("%^[A-Za-z0-9???????ó????????Ó?\.\,\-\?\!\(\)\"\ \/\t\/\n]{2,50}$%", stripslashes(trim($_POST['x']))){...}
Run Code Online (Sandbox Code Playgroud)

这应该允许可以在帖子的最终文本内容中使用的所有字符。问题是,尽管\n函数仍然不适用于我帖子中的新行,因此语法为

酒吧

不会工作。有人知道为什么该功能无法正常工作吗?

任何帮助将不胜感激。

kla*_*aar 5

缺省情况下preg_match()使用的模式^,并$会考虑整个字符串,即使它包含换行符。

可以使用Pattern Modifiers更改此行为,其中我将列出适合此主题的那些:

  • s (PCRE_DOTALL): 默认情况下,点 ( .)不会匹配换行符,但通过使用修饰符,s它会匹配。但是,字符类(例如[a-z][^a-z])从不将换行符视为特殊字符,因此该修饰符不会像点 ( .)那样影响它们的行为。

  • m (PCRE_MULTILINE):默认情况下,开始(^)和结束($)锚将默认匹配进行图案匹配的整个字符串的开始和结束时,甚至如果该字符串包含换行。但是,当使用此修饰符时,允许 preg 函数将字符串中由换行符分隔的每个部分视为一个完整的字符串,因此"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']))){...}
Run Code Online (Sandbox Code Playgroud)

我看不出有任何问题与您的图案,不同之处在于,你逃脱比其他字符不要求\-^(仅在字符类的开始)和](仅当在字符类的开始),但PHP 文档说仍然这样做并不违反。

但是,您的文本片段可能包含以下形式的换行符,\r\n并且由于\r不包含在您的模式的字符类中,因此不会匹配。

由于我的原始帖子提到了使用 Patter Modifier m,您回答说它有效,我想知道真正可能是什么问题。