Regexp偶数反斜杠(PHP)

时间:2010-12-06 09:03:05

标签: php regex

我很难把时间表达在正则表达式上,特别是更复杂的公式。

目前我正在编写自己的标记语言,并且因为逃避而感到难过。我希望每个特殊字符都“可以逃脱”,即如果*bold*会给我<b>bold</b>,那么\*bold\*应该保持原样,所以我可以稍后剥离反斜杠但我想不出一个正则表达式来表达这个想法 如何选择三组:

  1. 如果前面的数字或BSs是偶数,则留下星号;
  2. 星号之间的内容;
  3. 如果前面的BSs数是偶数,则为右星号;
  4. 有一个正则表达式?我需要它符合PHP的preg_replace

    这个\\*(\*)\S(.)+?\S\\*(\*)会选择星号和内容作为三个组,但这不会检查“偶数”和内容。

    更新:

    第二段已更改为更好地说明我的意思(请不要再修改它,因为所做的更改完全错过了这一点)。

    另外,如果这样可以让事情变得更容易,我可以先将任何双反斜杠解析为其他字符,因此只需要在星号之前检查一个反斜杠。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

好吧,我想我找到了回答自己的问题。

首先,我必须替换每个\\,然后使用这样的表达式:

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

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

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

从这里我可以随意调整它。感谢任何人的任何输入:)。