2012-03-21 1 views
1

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

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

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

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

Обратите внимание, что это может быть Умножить е параграфы.

[сноска: 2] Это текст сноски 2.

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

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

Ваши разделители должны соответствовать. Вы не можете использовать '{' и '}' – AndrewR

+1

Я действительно не думаю, что это проблема. Раньше я использовал шаблон с этими разделителями, и он работал нормально. –

+1

Хм, я думаю, это действительные разделители. Я не знал, что это сработает. :) – AndrewR

ответ

2

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

Например,

(?<!\\)\[ 

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

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

Редактировать # 1

Это отрицательный lookbehind применительно к вашему конкретному сценарию

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

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

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

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

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

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

Удачи вам, Buckley

+0

Мне не удается интегрировать его в исходный шаблон. Я пробовал ** «{(\ [fn:) ([0-9] *) (\]) (((?

+0

Это должно быть четыре обратной косой черты в обрамлении. Строковый токенизатор PHPs ест один уровень экранирования. – mario

+0

@mario вы можете помочь мне. Я все еще не могу понять это –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^