Как мне подобрать литерал в квадратных скобках, используя RegEx? - PullRequest
16 голосов
/ 08 декабря 2008

Какое регулярное выражение соответствует квадратной скобке? Я использую \\] в шаблоне в eregi_replace, но он не может найти ] ...

Ответы [ 6 ]

27 голосов
/ 08 декабря 2008

\] правильно, но обратите внимание, что сам PHP также имеет \ в качестве escape-символа, поэтому вам, возможно, придется использовать \\[ (или другой тип строкового литерала).

6 голосов
/ 08 декабря 2008

Работает без нареканий:

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

Выход:

abecd
3 голосов
/ 08 декабря 2008

Есть два способа сделать это:

/ [\]] /x;

/  \]  /x;

Хотя вы можете рассматривать последний вариант как лучший, и, действительно, я хотел бы рассмотреть его в более простых регулярных выражениях. Я бы рассмотрел первое, лучший вариант для больших регулярных выражений. Учтите следующее:

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

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

В этом примере первое - мое предпочтительное решение. Это делает лучшую работу по объединению отдельных объектов, каждый из которых может совпадать в данном месте. Это также может иметь некоторые преимущества в скорости, в зависимости от реализации.

Примечание. Это в синтаксисе Perl, частично для обеспечения правильного выделения.
В PHP вам может понадобиться удвоить обратную косую черту. "[\\]]" и "\\]"

3 голосов
/ 08 декабря 2008

Вам не нужно избегать его: если он изолирован, a] рассматривается как обычный символ.
Протестировано с помощью eregi_replace и preg_replace.

[это другой зверь, ты должен сбежать от него. Похоже, одинарные и двойные кавычки, одинарные или двойные экранирование обрабатываются PHP одинаково для обоих семейств регулярных выражений.

Возможно, ваша проблема в другом месте вашего выражения, вы должны дать ее полностью.

0 голосов
/ 08 декабря 2008

В .Net вы экранируете специальные символы, добавляя обратную косую черту; "\" означает, что это станет; "[" ...

Хотя, поскольку вы обычно делаете это в строковых литералах , вам придется либо сделать что-то подобное;

@"\["

или как-то так;

"\\["
0 голосов
/ 08 декабря 2008

Ваша проблема может быть связана с тем, что вы используете eregi_replace с первым параметром, заключенным в простые кавычки:

 '\['

В двойные кавычки , однако, это может хорошо работать в зависимости от контекста, поскольку изменяет способ передачи параметра в функцию (простые кавычки просто передают строку без любая интерпретация, следовательно, необходимо удвоить символ "\").

Здесь, если "\[" интерпретируется как escape-символ, вам все равно нужно удвоить "\".

Примечание: на основании вашего комментария вы можете попробовать регулярное выражение

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

для обнаружения [ сразу после <br> или <p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...