0

php で preg_match_all を使用して、DSL で記述された文字列からトークンを作成しています。テスト文字列を PHP コードにハードコードして実行すると、すべて機能します。ただし、データベースから同じ文字列を読み取ると、最初の 2 つのトークンと一致し、残りの文字列は 1 つのトークンとして一致します。これは、文字列がハードコードされている場合のように、明らかに複数のサブユニットに分割する必要がある場合です。

どうすればいいの?

「残り」と一致させるために、正規表現で .+ を使用しています。基本的に、私の DSL はキーワードとその他で構成されているため、preg_match_all の正規表現は次のようになります。

/(?P<NameOfKeyword1>Keyword1)|(?P<NameOfKeyword2>Keyword2)|(?P<NameOfKeyword3>Keyword3)|(?P<Linebreak>\\v+)|(?P<Rest>.+(?=Keyword1)|.+(?=Keyword2)|.+(?=Keyword3)|.+)/

基本的に、最初にキーワードを照合し、次に改行を照合し、次に次のキーワード (または改行または文字列の末尾) が現れるまで残りを照合します。

では、文字列がハードコードされている場合は適切に一致するのに、データベースから同じ文字列を読み取る場合は一致しないのはなぜでしょうか?

データベースから読み取る場合、1 つのトークンとして一致する文字列の残りの部分は、間にキーワードがあるため、1 つのトークンとして一致するべきではありません。.+ に基づいて一致するように見えます

編集: preg_match_all に使用するフラグは PREG_SET_ORDER と PREG_OFFSET_CAPTURE です

4

1 に答える 1