0

次のような文字列を解析しようとしています:

preg_match( "|from:(.*?);|", $string, $match);

しかし、その後、文字列にはlfrom:とを含めることもできることがわかりました_from:

文字列がどのようになるかのいくつかの例:

var1:34234;from:website1.com;lfrom:website2.com;var2:343423; lfrom:website1.com;var1:4234234;from:website2.com from:website1.com;_from:website2.com;lfrom:website2.com;var1:43523;

、などfrom:(.*?);ではなくlfrom、のみを解析するにはどうすればよいですか。_from

4

4 に答える 4

1

解決策を提供するつもりでしたが、後読み修飾子について説明したほうがよいでしょう。

hたとえば、正規表現で「一致」するたびhに、正規表現が現在ある場所のポインターに1が追加されるため、ポインターに何も「追加」したくありません。fromの前に a;\s\bまたは文字列の先頭があるかどうかを調べたいだけです。どこにでもボイドがあるので、ボイドと一致させたくありません!!

例: これは、前に(?<a)ba がある a に一致します。したがって、次のことを行うだけです。 aが見つかった場合、その前に検索し、 it がある場合は正規表現に一致します。baba

だから...それが持っている直前にそれ(?<=[;\s\b]|^)from:(\w+\.\w+)と一致しますfrom[;\s\b] OR ^ (The string start)

デモ

簡単でしょ!?

于 2012-11-06T19:00:17.480 に答える
1

次のいずれかのアサーションを使用できます。

|(?<!l)from:(.*?);|

;または、先行または行頭を探します。

|(;|^)from:(.*?);|m

.*?一般的な一致を次のように置き換えることも良い考えかもしれません[^;]*

于 2012-11-06T18:51:51.047 に答える
0

先行fromが空白または;

/[\s\b;]from:([^;]+);/

fromこれは、スペース、単語境界、または が先行する場合にのみ一致し;ます。また、キャプチャを絞り込むことも好みます。つまり、[^;]+vs [.*?]. ; です。

于 2012-11-06T18:51:19.203 に答える
0

(ネガティブ) 後読みと呼ばれる概念があります。これは、現在の位置が特定のものによって先行されている (されていない) ことを主張します。この場合、肯定的な後読みを使用し、そのfrom前に文字列の先頭、改行、または;:があると主張します。

preg_match('|(?<=^|;)from:(.*?);|m', $string, $match);

文字列の先頭だけでなく、各行の先頭でも一致するmように、必ず複数行モードを使用してください。^

他の文字を除外して前に置きたいだけで、他の文字を受け入れる場合は、否定的な後読みがあなたが探しているものかもしれません:l_from

preg_match('|(?<![l_])from:(.*?);|m', $string, $match);

後読みの便利な点は、実際の一致には含まれないことです。彼らは実際にそれを消費することなく、そこにあるものをチェックするだけです. ここにいくつかの読書があります。

于 2012-11-06T18:51:53.380 に答える