PHP 模式修饰符:$ 表示多行字符串中的行尾


PHP Pattern Modifier: $ for End-of-Lines in Multi-Line Strings

注意:请参阅本文底部,了解为什么这最初不起作用。

PHP中,我尝试在字符串缓冲区中每行的末尾匹配小写字符。

正则表达式模式应为 [a-z]$。但这仅与字符串的最后一个字母匹配。我相信这是一个正则表达式修饰符问题;我已经尝试了/s/m/D,但似乎没有什么符合预期的。

<?php
$pattern = '/[a-z]$/';
$string = "this
is
a
broken
sentence";
preg_match_all($pattern, $string, $matches);
print_r($matches);
?>

下面是输出:

Array
(
    [0] => Array
        (
            [0] => e
        )
)

以下是我期望的输出:

Array (
    [0] => Array (
        [0] => s
        [1] => s
        [2] => a
        [3] => n
        [4] => e
     )
)

有什么建议吗?


更新:PHP源代码是在Windows机器上编写的;按照惯例,Windows中的文本编辑器表示换行符的方式与Unix系统上的文本编辑器不同。

看起来 Windows 文本文件的字节码表示(继承自 DOS(没有被 PHP 正则表达式引擎所尊重。将行尾字节码格式转换为Unix解决了原始问题。

Adam Wagner(见下文(发布了一种模式,无论行尾字节表示如何,该模式都匹配。

zerkms 有规范的正则表达式,我正在授予答案。

$pattern = '/[a-z]$/m';
$string = "this
is
a
broken
sentence";
preg_match_all($pattern, $string, $matches);
print_r($matches);

http://ideone.com/XkeD2

这将准确返回您想要的内容

正如@Will指出的那样,您似乎想要每个字符串的第一个字符,或者您的示例是错误的。 如果你想要每行的最后一个字符(仅当它是小写字符时(,你可以试试这个:

/[a-z](?:'n)|[a-z]$/

第一段[a-z](?:'n) ,检查换行符前的小写字符。 然后[a-z]$获取字符串的最后一个字符(以防它后面没有换行符。

对于示例字符串,输出为:

Array
(
    [0] => Array
        (
            [0] => s
            [1] => a
            [2] => n
            [3] => e
        )
)

注意 - "is"中的"s"不存在,因为它后面跟着一个空格。 要捕获此"s"(忽略尾随空格(,您可以将正则表达式更新为:/[a-z](?:[ ]*'n)|[a-z](?:[ ]*)$/ ,这将检查换行符(或字符串末尾(之前的 0 个或多个空格。 哪些输出:

Array
(
    [0] => Array
        (
            [0] => s
            [1] => s 
            [2] => a
            [3] => n
            [4] => e 
        )
)

更新

似乎行尾样式不喜欢您的正则表达式。 为了解释疯狂的行尾(行尾的另一个令人讨厌的空白(,你可以使用它(并且仍然得到/m的好处(。

/[a-z](?:'W*)$/m

看起来您希望在每个换行符之前匹配,而不是在文件末尾。也许你想要

$pattern  = '/[a-z]'n/';