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

时间:2012-01-02 02:45:30

标签: php regex

注意:请参阅此帖子的底部,了解原因无法解释的原因。

在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系统上的文本编辑器不同。

似乎PHP正则表达式引擎不支持Windows文本文件(从DOS继承)的字节码表示。将行尾字节码格式转换为Unix解决了原始问题。

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

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

3 个答案:

答案 0 :(得分:2)

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

$string = "this
is
a
broken
sentence";

preg_match_all($pattern, $string, $matches);

print_r($matches);

http://ideone.com/XkeD2

这将完全返回您想要的内容

答案 1 :(得分:1)

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

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

第一个句段[a-z](?:\n),在换行前检查小写字符。然后[a-z]$获取字符串的最后一个字符(如果没有后跟换行符。

使用示例字符串,输出为:

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

)

注意 - 'is'中的'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

答案 2 :(得分:0)

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

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