2010-12-06 3 views
1

У меня довольно трудное время, когда я склоняюсь к регулярному выражению, особенно к более сложным формулам.Regexp равномерное число обратных косых черт (PHP)

В настоящее время я пишу свой собственный язык разметки, и я в тупике, убегая. Я хочу, чтобы каждый специальный символ был «escapable», то есть, если *bold* дал бы мне <b>bold</b>, то \*bold\* должен оставить его как есть, поэтому я могу сделать зачистку обратных косых черт позже, но я не могу думать о регулярном выражении передайте эту идею.
Как я могу выбрать три группы:

  1. Left звездочку, если число или ОЭ предшествующее ему даже;
  2. Контент между звездочками;
  3. Правая звездочка, если число BSES, предшествующих ей, равно;

с одним регулярным выражением? Мне нужно, чтобы он соответствовал PHP preg_replace.

Этот \\*(\*)\S(.)+?\S\\*(\*) будет выбирать как звездочки, так и контент как три группы, но это не проверяет «четность» и прочее.

UPDATE:

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

Плюс, если это упростит ситуацию, я могу сначала разобрать любой двойной обратный слэш на какой-то другой символ, поэтому нужно только проверить ОДИН косую черту перед звездочкой.

+0

Вы имеете в виду `\\ * bold \\ *` производит `* bold *`? – kennytm 2010-12-06 09:17:02

+1

Это больше похоже на работу для * parser *, а не на RegEx. – deceze 2010-12-06 09:17:59

ответ

0

Ну, я думаю, я нашел ответ на свой вопрос.

Сначала я должен заменить каждый \\, а затем использовать выражение как это:

(?<!\\)  #There is no backslash before... 
\*   #...Asterisk 

(   #Non-whitespace after first and before second asterisk 
    \S .*? \S 
    | 
    \S 
) 

(?<!\\)  #There is no backslash before... 
\*   #...Asterisk 

И из здесь я могу настроить его, однако я хочу. Спасибо за любой вклад кому-то в любом случае :).

1

Как насчет:

$rx = '/ 
([^\\]*|^)  # no backslash or beginning of line 
\\    # one backslash 
\*    # an asterisk 

([^*\\]+)  # one or more characters not being asterisks or BSs 

\\    # one backslash 
\*    # one asterisk 
       # "mx" = multiline,extended regex 
/mx';    

preg_replace($rx, '\1\2', $content)

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