首先解释我对php的新内容和im非常新的preg_match并发现它令人困惑,我试图做的是找到一个关键字:exception:然后从下一行开始拉出300个字符
我已经有了pregmatch,但是想要改进它,我正在做的是从关键字中提取300个字符,但问题是关键字是异常名称,然后在下一行是代码错误,异常可以用任意数量的语言编写,但异常后的代码错误与语言无关,所以我想过滤掉异常,因为它因语言而异,所以我知道异常在以后比较时是否是100%匹配。
以下是一些例外情况的例子:
Exception: System.Runtime.InteropServices.COMException (0x800401D0): OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Windows.Clipboa
exception: Specified cast is not valid.
Query:Select * from TourneyData where Player_id = 1412
14:14:18.868 [SetCurrentPlayer:12 - DatabaseBase.HandleDatabaseConnectionException] 4: System.InvalidCastException: Specified cast is not valid.
at NpgsqlTypes.NpgsqlTimeStamp.op_I
Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.Application.ThreadContext.ExitCommon(Boolean disposing)
at System.Windows.Forms.Application.ExitInternal()
at System.Windows.Forms.Application.Exit(C
因此,我计划如何解决代码错误是在关键字异常后的下一行显示所有信息:
在最后一个例子中,我想要的输出是:
at System.Windows.Forms.Application.ThreadContext.ExitCommon(Boolean disposing)
at System.Windows.Forms.Application.ExitInternal()
at System.Windows.Forms.Application.Exit(C
好的,所以这里是我已用于在关键字后收集300个字符的代码:
// Snippet length constant
define(SNIPPET_LENGTH, 300);
$pos = stripos($body,$keyword);
$snippet_pre = substr($body, $pos, SNIPPET_LENGTH);
现在我也在一些函数中使用preg_match来提取信息,例如代码中有这个查找日志信息:
12:19:42.787 [Main:1 - Bootstrapper.LogSystemInfo] Current culture: it-IT
12:19:42.865 [Main:1 - Bootstrapper.LogSystemInfo] Operating System Name: Microsoft Windows 7 Home Premium
12:19:42.865 [Main:1 - Bootstrapper.LogSystemInfo] Operating System Architecture: 64 bit
12:19:42.865 [Main:1 - Bootstrapper.LogSystemInfo] Operating System Service Pack: Service Pack 1
这是preg_match,只包括它可能有助于区分如何区分换行符,因为这会捕获换行符之前的所有信息,但我不知道如何在换行后获得300个字符:
preg_match('/Current culture: (.*)/', $body, $culture_pre);
preg_match('/Operating System Name: (.*)/', $body, $os_name_pre);
preg_match('/Operating System Architecture: (.*)/', $body, $os_bit_pre);
preg_match('/Operating System Service Pack: (.*)/', $body, $os_service_pack_pre);
如果您需要任何其他信息,请与我们联系
答案 0 :(得分:0)
preg-match
并且所有正则表达式在遇到\n
或\r\n
时很难处理。
您可以使用m
修饰符来解决某些情况,但它唯一能做的就是更改保留字符$
和^
的行为,使它们匹配结束或开始字符串考虑到\n
因为它会在不同的子串中分割字符串。我不认为这会对你的问题有效,但你可以试试。
还有其他可行的方法来解决这个问题,尽管并非所有方法都是完全清晰的:
1-简单方法:在应用正则表达式之前删除\r\n
或\r
:
$chars=array("\r\n", "\n", "\r");
$string=str_replace($chars, '', $string);
正则表达式会像这样工作,但是如果你想让它保持多线,就会丢失字符串的格式。
2-简单且不那么干净的方式:将\n
更改为您知道它不会出现在字符串中的特殊字符(例如#
),应用正则表达式,更改特殊字符再次来到\n
。它并不漂亮,但如果你的时间很短,它就会起作用。
3-不那么容易,干净的方式:使用\n
作为键分割字符串,使用preg_match()
逐行读取,如果匹配则保存以下2或3(或任何数字)你需要保存)。