Узор не экранирующий персонажей - PullRequest
1 голос
/ 21 марта 2012

У меня есть этот шаблон, который я использую с preg_match, и я не могу понять, где я ошибаюсь.

$pattern = "{(\[fn:)([0-9]*)(\])((?:\\\[|[^\[])*)}";

Он должен соответствовать каждому [fn: i] text_multiline пока другой не запустится, когда он встретит [ и я хочу экранировать [ на \ [ из следующего примера:

[fn: 1] Это текст для \ [необходимо экранировать] сноска 1.

Обратите внимание, что это может быть несколько абзацев.

[fn: 2] Этотекст для сноски 2.

Это совпадения, которые я получаю в данный момент:

array(5) {
  [0]=>
  string(6) "[fn:1]"
  [1]=>
  string(4) "[fn:"
  [2]=>
  string(1) "1"
  [3]=>
  string(1) "]"
  [4]=>
  string(0) ""
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Техника, которую нужно использовать, когда вы хотите исключить и избежать [называется «отрицательный взгляд позади».

Например,

(?<!\\)\[

Это регулярное выражение будет соответствовать [но игнорируется, если егозатем \

Дайте мне знать, если вам нужна дополнительная помощь

Правка # 1

Это отрицательный взгляд, примененный к вашему конкретному сценарию

\[fn:\d+](?:\\\[|[^[])*

и в php это становится

if (preg_match('/\[fn:\d+\](?:\\\\\[|[^[])*/', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

Некоторые примечания

  • Я использую чередование и позволяю ему сначала соответствовать экранированному [поэтомуисключить из-за того, что соответствует после чередования (общий прием, основанный на чередовании чередования)
  • Я начал с нуля, поэтому, если вам нужно захватить некоторые группы, добавьте круглые скобки, где это необходимо
  • Конструкция(? :) используется для группировки, но не для захвата.Это (возможно) более эффективно, и, как я уже сказал, я пропустил захват

Регулярное выражение проверено на вашем примере.Дайте мне знать, если вы можете заставить его работать сейчас

Удачи, Бакли

0 голосов
/ 21 марта 2012

preg_replace_all("#\\[(?!fn:\\d+\\])#", "\\[") добьется цели, но лучше не использовать регулярные выражения для этого.

...