注意:请参阅此帖子的底部,了解原因无法解释的原因。
在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有规范的正则表达式,我正在给出答案。
答案 0 :(得分:2)
$pattern = '/[a-z]$/m';
$string = "this
is
a
broken
sentence";
preg_match_all($pattern, $string, $matches);
print_r($matches);
这将完全返回您想要的内容
答案 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/';