正则表达式结果一致性问题

时间:2015-03-24 02:59:38

标签: php regex preg-match-all

似乎在我的PHP代码中向在线编辑器输出了一个非常不同的输出,以下网站都显示我的模式和字符串应该匹配......它表明它在以下网站中匹配:

http://www.phpliveregex.com/

https://regex101.com/

有人可以在这里发现问题吗?

模式

$a= "/H(\d{7})_([\d\w]*)\n([\n\w\.]*?)V($b)_(\d)_(\d)_(\d*)(_([a-z_\d]*)($c)($c))/";

注意在$ b&中使用变量$ C

字符串

$buffer =   "H2241008_1211901000000013220
R001_1
W1443.91
Maa_01D11100000000000016210053_W802.83
Mab_02D21100000000000024210054_W1323.18
Mzz_00000000000000000000000000_W0.00
T1_
V15_0_1_1210_aa225400225459_aa233900234159
V16_0_1_1210_ab192500205059_aa225500225659
V17_0_1_1210_aa225100225359_aa234200234659
V18_0_1_1210_aa224900225059_aa233800233859_aa234700240159
V19_0_1_1210_aa224400224459_aa230400230459
V303_0_1_1210_aa225700230359_aa232700233759
V402_0_1_1210_aa230800232359_aa232600232659
V450_0_1_1210_aa224500224859
V614_0_1_1210_aa224300224359_aa230500230759_aa232400232559
V65535_0_1_1210_ab192500205059_aa224300240159";
$buffer = str_replace("\r\n", "\n", $buffer);

获取匹配

preg_match_all($a, $buffer, $matches);
preg_match_all("/H(\d{7})_([\d\w]*)\n([\n\w\.]*?)V(15)_(\d)_(\d)_(\d*)(_([a-z_\d]*)(2254[0-9]{2}|500)(2254[0-9]{2}|500))/", $buffer, $output_array);

var_dump($matches);
var_dump($output_array);

我已经尝试过两种方式(检查语法与使用模式字符串中的变量),就像我认为$\w,{{1}一样会阻碍,但两者都会这样回复:

\n

我的期望;是一场比赛,有11个部分。我认为这可能是PHP正则表达式与其他引擎的区别,但 phpliveregex 给出了上面尝试的确切语法(array(12) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } [3]=> array(0) { } [4]=> array(0) { } [5]=> array(0) { } [6]=> array(0) { } [7]=> array(0) { } [8]=> array(0) { } [9]=> array(0) { } [10]=> array(0) { } [11]=> array(0) { } } ),并且它完全按预期返回。

请帮忙!

2 个答案:

答案 0 :(得分:0)

在正则表达式中,使用\n字符(换行符)。你必须确保在你的示例字符串中有正确的行结尾(当然,在正则表达式中,取决于你实际想要匹配的内容)。

将示例PHP代码复制到PSPad并选择格式 - >保存前的Unix(LF)会导致填充$output_array

如果您想匹配Windows样式行结尾,请将\n替换为\r\n

答案 1 :(得分:0)

好的,看起来我的$buffer有误导性。我把它粘贴在这里,它没有像我在代码中那样的缩进,而且缩进中的额外字符导致了这个问题。

不想摇摇欲坠的船,但我现在还没有使用双引号作为正则表达式的变量 - 以防万一。取得了理想的结果。