デモ:
$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/>[A-Z0-9].*?see below[^,\.<]*/','',$str);
echo $repstr;
この小さなプログラムに出力させたいのは「bcs>Hello」ですが、実際には「bcs」だけです。
私のパターンの何が問題になっていますか?
デモ:
$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/>[A-Z0-9].*?see below[^,\.<]*/','',$str);
echo $repstr;
この小さなプログラムに出力させたいのは「bcs>Hello」ですが、実際には「bcs」だけです。
私のパターンの何が問題になっていますか?
問題は、貪欲でない量指定子がどのように機能するかを誤解していることだと思います。いったん稼働すると、はい、そうでない場合よりも早く停止します。しかし、その前に何が来るか (あるいは、後に来る可能性のあるテキストも) は認識しません。現在の位置にのみ関係があります。したがって、投稿した正規表現は次のすべてに一致します。
">Hello >If see below!"
これがどのように機能するか見てみましょう:
/>[A-Z0-9].*?see below[^,\.<]*/
正規表現は最初に "bcs >Hello >If see below!" で ">" を探し、"Hello" の直前にある最初のものを見つけます。では、式の次の部分を確認しましょう。
[A-Z0-9]
次の文字は H で、パターン [A-Z0-9] に一致します。まだいい!次:
.*?
ここで、「see below[^,.<]*」の残りの式に一致する最初のインスタンスに到達するまで、すべての非改行文字に一致します。単純な貪欲な量指定子だけを使用した場合、最後の可能性のあるものに一致するまで、「be below[^,.<]* を参照」の複数のケースを一致させることができます。(したがって、文字列が続き、そのパターンに一致する他のテキストがあった場合、それもキャプチャされます)貪欲でない量指定子は、パターン全体が可能な限り最小の一致を返すことを意味しません文字列で一致します。特定の文字の一致がどのように機能するかを指示するだけです。
次に、次のパターンを試してみてください。
/>[A-Z0-9][^>]*?see below[^,\.<]*/
うまくいけば、これで解決します!
次のように書きませんか。
$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/>If see below[^,\.<]*/','',$str);
echo $repstr;
これは、あなたが持っているものに代わる良いものかもしれません. 正規表現の問題は、必要なものを選択する代わりに、不要なものを選択して空の文字列に置き換えていることです。私の意見では、最善のアプローチは、必要なものを選択することです。それが、以下のコードが行うことです。最終的に得られるのは、最初のサブパターンに一致するものです。それ以外の場合は、文字列が返されます。
$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/^([\w]+ >[\w]+).*?see below.*?$/i', '$1', $str);
var_dump($repstr);
これが役立つことを願っています。