PHP正则表达式正在截断匹配

时间:2016-10-05 19:48:49

标签: php regex

需要一点帮助。

我认为我在那里。

我在文本正文中有这样的字符串:

" line:这是或其他带有转义分号的东西\;但是我想忽略这个到最后一个;"

所以在我的字符串中间我想要包含转义的半冒号但不将其视为字符串的结尾 - 字符串的结尾应该是最后的分号。

我有这个正则表达式模式:

$regex = "/line:(.*?)[^\\\;];/";

虽然它与模式匹配:

preg_match_all($regex, $texttosearch, $matches)

$ matches [1] [0]的内容被截断,在本例中,' e'缺少......

Array
(
[0] => Array
    (
        [0] => line: this is something or other with an escaped semi-colon here \; but I want to ignore that up to this final one;
    )

[1] => Array
    (
        [0] =>  this is something or other with an escaped semi-colon here \; but I want to ignore that up to this final on
    )

 )

有人可以帮我解决我的错误吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

我认为只使用lookbehind检查;前面是否\是否容易出错,以防您有其他转义序列。使用此展开的正则表达式(作为PHP单引号字符串文字):

'~line:([^;\\\\]*(?:\\\\.[^;\\\\]*)*);~'

请参阅regex demo

详细

  • line: - 文字子字符串(将其作为整个字词匹配,在其前面添加\b
  • ([^;\\]*(?:\\.[^;\\]*)*) - 第1组捕获:
    • [^;\\]* - 除;\
    • 以外的0个字符
    • (?:\\.[^;\\]*)* - 0+序列:
      • \\. - 任何转义字符(添加~s修饰符以允许.匹配换行符)
      • [^;\\]* - 除;\
      • 以外的0个字符
  • ; - 分号