2

php を使用して、一致した部分の直後の部分に特定の文字が含まれていないかどうかによって、文字列内の何かを検出したいと考えています。先読みの否定的なアサーションを使用する必要があるかもしれないと思いますが、期待どおりに機能していないのでわかりません。たとえば、次のようになります。

$string = 'test somerandomURL><b>apple</b> peach orange';

<b>apple</b>最初までのすべてを検出する式が欲しい >最初の直後に続かない限り>

私は試した

if(preg_match("/test(.*)>(?!<b>apple<\/b>)(.*)/i",$string)){
echo 'true since <b>apple</b> does not follow > in string';
}else{
echo 'false since <b>apple</b> follows > in string';
}

> の後に文字列が含まれている場合、<b>apple</b>予想どおり必要に応じて false を返します<b>peach</b>が、代わりに > の後に文字列を変更すると、代わりに<b>apple</b>false が返され、true を返す必要があります。太字のタグがなければ、期待どおりに機能するようです。私が間違っていることはありますか?

4

1 に答える 1

1

()/エスケープが必要なが一致していないため、エラー報告をオンにしないなど、いくつか間違っています。

最初の問題は、.* が貪欲であることです。したがって、文字列では一致します:test somerandomURL><b>apple</b>

通常、それに対する解決策は遅延させることですが、否定的な先読みのために、遅延はリンゴが見つかったときに.*?それをさらに一致させます。>

解決策は、否定された文字クラスです。[^>]*を除く任意の文字に一致します>

/test([^>]*)>(?!<b>apple<\/b>)(.*)/i
于 2013-09-15T02:09:20.550 に答える