0

最初に私がphpに慣れていないことを説明し、preg_matchに非常に慣れていないことを説明し、それが混乱していることに気づきました.私がやろうとしているのは、キーワードを見つけることです:

私はすでにこれのために 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);

追加情報が必要な場合はお知らせください

4

1 に答える 1

0

preg-match\nまた、一般にすべての正規表現は、またはに遭遇したときに対処するのが困難\r\nです。

修飾子を使用していくつかmのケースを解決できますが、それが行う唯一のことは、予約文字の動作を変更し、文字列を異なる部分文字列に分割することを考慮して、文字列の末尾または先頭に一致させること$です。これはあなたの問題ではうまくいかないと思いますが、試してみることができます。^\n

これを修正する方法は他にもありますが、すべてが完全にクリーンというわけではありません。

1- 簡単な方法:正規表現を適用する前に\r\norを削除します:\r

$chars=array("\r\n", "\n", "\r");
$string=str_replace($chars, '', $string);

正規表現はこのように機能しますが、文字列を複数行にしたい場合は、文字列の形式が失われます。

2-簡単であまりきれいではない方法:\n文字列に表示されないことがわかっている特別な文字に変更し(たとえば、#)、正規表現を適用し、特別な文字を再びに変更し\nます。きれいではありませんが、時間がない場合はうまくいきます。

3-それほど簡単ではありませんが、きれいな方法です。\nキーとして使用して文字列を分割し、行ごとに読み取り、 を適用しpreg_match()ます。一致する場合は、次の 2 行または 3 行 (または保存する必要がある任意の数) の行を保存します。

于 2012-12-31T10:36:46.823 に答える