【问题标题】:Regular Expression result consistency issue正则表达式结果一致性问题
【发布时间】:2015-05-27 06:30:10
【问题描述】:

我的 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\n 等会妨碍,但两者都像这样返回:

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) { } }

我的期望;就是得到一个火柴,有11个零件。我认为这可能是 PHP 正则表达式与其他引擎的差异,但 phpliveregex 给出了与上面尝试的完全相同的语法 ($output_array),并且它完全按预期返回。

请帮忙!

【问题讨论】:

  • $b$c 对于给定的示例缓冲区有什么值?
  • 使用第二行 preg_match_all 中的实际值:$b = 15 和 $c = 2254[0-9]{2}|500

标签: php regex preg-match-all


【解决方案1】:

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

不想摇摆不定,但我现在不使用双引号作为正则表达式的变量——以防万一。达到了预期的结果。

【讨论】:

    【解决方案2】:

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

    将示例 PHP 代码复制到 PSPad 并选择格式 -> Unix (LF),然后将结果保存在填充的 $output_array 中。

    如果你想匹配 windows 风格的行尾,请将 \n 替换为 \r\n

    【讨论】:

    • 很好,虽然在这个缓冲区 sn-p 来自的实际文件中,行尾实际上是 \n (是的,生活在一个 linux 盒子里);然而,为了将它排除在等式之外,我在它之后添加了$buffer = str_replace("\r\n", "\n", $buffer);,但它没有改变。在我确定正则表达式没问题之前,我已经切换到使用 $buffer 变量的这个 sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多