【问题标题】:PHP preg_match not working for new line [duplicate]PHP preg_match不适用于新行[重复]
【发布时间】:2016-07-09 13:05:04
【问题描述】:

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

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

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

酒吧

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

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过使用 /m 标志?
  • m 标志有效。克拉尔是第一个
  • @aln447:不,它不起作用,如果你使用 m 修饰符,如果你的字符串中只有一行匹配模式,preg_match 将成功(尝试使用允许字符的第一行和第二行带有禁止字符)。您的问题可能是您的字符串使用了 Windows 换行符序列 \r\n (CRLF),并且由于 \r 不在您的字符类中,因此它不起作用。

标签: php regex


【解决方案1】:

默认情况下,带有使用^$ 的模式的preg_match() 将考虑整个字符串,即使它包含换行符。

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

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

  • m (PCRE_MULTILINE):默认情况下,开始 (^) 和结束 ($) 锚点将默认匹配进行模式匹配的整个字符串的开始和结束,甚至 if 该字符串包含换行符。但是,当使用此修饰符时,允许 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']))){...}

我认为您的模式没有太大问题,除了不需要您转义 \-^(仅在字符类的开头)和 @987654346 以外的字符@ (仅当 not 在字符类的开头时),但 PHP 文档说仍然这样做并不违反。

不过,您的文本 sn-p 可能包含 \r\n 形式的换行符,并且由于 \r 未包含在您的模式的字符类中,因此不会匹配。

由于我的原始帖子提到使用模式修饰符m,您回复说这很有效,我想知道真正的问题可能是什么。

【讨论】:

  • 抱歉,您的回答完全错误。修饰符 m 不允许匹配跨越多行(“多行”一词在这种情况下有点误导)。 m修饰符的作用只是将^$锚点的含义从字符串的开头和结尾更改为行的开头和结尾。
  • @CasimiretHippolyte:你当然是对的!我已经重写了我的答案,以更好地反映模式修饰符的真相以及它们如何影响 preg 函数的行为。不过,我仍然想知道,我的错误答案可能对 OP 有何帮助。
  • OP 认为您的错误答案很好,因为他已经获得了一个匹配(与模式匹配的第一行,即:foo)与一个应该通过的字符串(他没有问问题或使用其他字符串进行测试,将允许字符的行和不应通过的禁止字符的行混合)。但该模式不会检查所有字符串。
  • 那么你们提出的解决问题的实际正确方法是什么?提供的答案确实对我有用,所以我接受了。不是 php 专业人士
  • @aln447 你能检查一下你想匹配你的模式的字符串,看看里面是否确实有一个回车符(\r),因为它不包含在您的模式提供的字符类?这是我现在唯一的预感。您可以使用任何半高级编辑器,如 Notepad++,并打开显示所有字符的功能,包括空格(表示空格、制表符和换行符)。
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多