web-dev-qa-db-ja.com

RegExを使用して角かっこリテラルを一致させるにはどうすればよいですか?

大括弧に一致する正規表現は何ですか? \\]のパターンでeregi_replaceを使用していますが、]...を見つけることができないようです。

21
aalaap

\]は正しいですが、PHP自体にもエスケープ文字として\があるため、\\[(または別の種類の文字列リテラル)。

30

完璧に動作します:

<?php
    $hay = "ab]cd";
    echo eregi_replace("\]", "e", $hay);
?>

出力:

abecd
6
Bombe

エスケープする必要はありません。孤立した場合、]は通常の文字として扱われます。
eregi_replaceとpreg_replaceでテスト済み。

[別の獣です、あなたはそれを脱出する必要があります。一重引用符と二重引用符のように見え、単一または二重のエスケープは、両方の正規表現ファミリーで、PHPによってすべて同じように扱われます。

多分あなたの問題はあなたの表現の他の場所にあります、あなたはそれを完全に与えるべきです。

3
PhiLho

これには2つの方法があります。

/ [\]] /x;

/  \]  /x;

後者をより良いオプションと考えるかもしれませんが、実際には、より単純な正規表現で使用することを検討します。私は前者、より大きな正規表現のためのより良いオプションを検討します。以下を検討してください。

/ (\w*) (  [\d\]] ) /x;

/ (\w*) ( \d | \] ) /x;

この例では、前者が私の推奨ソリューションです。個別のエンティティを組み合わせるというより良い仕事をします。エンティティはそれぞれ、指定された場所で一致する場合があります。また、実装によっては、速度が向上する場合があります。

注:これはPerl構文に含まれていますが、一部は適切に強調表示されます
In PHPバックスラッシュを2倍にする必要があるかもしれません。"[\\]]"および"\\]"

3
Brad Gilbert

問題は、最初のパラメーターを単純な引用符で囲んでeregi_replaceを使用しているという事実に起因している可能性があります。

 '\['

二重引用符 では、 パラメータを変更する方法 が関数に渡されるため、コンテキストに応じてうまく機能する可能性があります(単純な引用符は文字列を渡さずに渡すだけです)解釈。したがって、「\」文字を2倍にする必要があります。

ここで、"\["がエスケープ文字として解釈される場合でも、「\」を2倍にする必要があります。

注:コメントに基づいて、正規表現を試すことができます

<\s*(?:br|p)\s*\/?\s*\>\s*\[

[または<br>の直後に<p>を検出するため

0
VonC

.Netでは、バックスラッシュを追加して特殊文字をエスケープします。 「\」はそれがなることを意味します。 「[」...

ただし、通常はstring literalsでこれを行うので、次のようにする必要があります。

@"\["

またはこのようなもの;

"\\["
0
Thomas Hansen