2010-12-06 8 views
1

정규식, 특히 더 복잡한 수식에 대해 머리를 쓰는 데 다소 어려움이 있습니다.Regexp 짝수 백 슬래시 (PHP)

현재 나는 자신의 마크 업 언어를 작성 중이며 도망치기가 어렵다. 나는 각각의 특수 문자가 "탈출"이되기를 바란다. 즉, *bold*이 나에게 <b>bold</b>을 줄 것이라면, \*bold\*은 그대로 두어야한다. 그래서 백 슬래시를 나중에 제거 할 수는 있지만 정규 표현식을 생각할 수 없다. 이 아이디어를 전달합니다. 그 앞에 숫자 또는 BSes도 경우

  1. 왼쪽 별표;
    어떻게 세 그룹을 선택할 수 있습니다
  2. 별표 사이의 콘텐츠;
  3. 앞의 BS 수가 짝수 인 경우 오른쪽 별표가 표시됩니다.

정규 표현식 1 개? PHP의 preg_replace을 준수해야합니다.

\\*(\*)\S(.)+?\S\\*(\*)은 별표와 내용을 세 그룹으로 선택하지만 '균등성'과 물건을 확인하지는 않습니다.

UPDATE :

두 번째 단락은 더 나은 내가 (완전히되었다 변경이 점을 놓친 때문에 더 이상 수정하지 마십시오) 무엇을 의미하는지 설명하기 위해 변경되었습니다.

더 쉽게 작업 할 수 있다면, 이중 백 슬래시를 다른 문자로 구문 분석 할 수 있으므로 별표 앞에 백 슬래시가 하나만 있는지 확인하면됩니다. 에 대해

+0

'\\ * bold \\ *'은'* bold * '을 생성합니까? – kennytm

+1

RegEx가 아닌 * 파서 *의 작업과 비슷합니다. – deceze

+0

@KennyTM 고정, 고맙습니다! @deceze 나도 몰라, Regexps가 사람들이 때때로 그들과 함께하는 마법의 것들을 생각할 때 그것이 가능하지 않아야하는 이유를 모르겠다. – Maurycy

답변

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)

+0

그것은 알 수없는 "#"에 대한 오류를 제공합니다. 주석과 공백을 제거하면 오프셋 23의 문자 클래스에 대해 컴파일이 실패했습니다 : 종료되지 않습니다. * – Maurycy

+1

코드를 편집했습니다. 그것은 작동합니다. –

+0

아니, 여전히 작동하지 않습니다. * missing terminating] 오프셋 297의 문자 클래스 * 대괄호 두 번째 집합에 다른 백 슬래시를 추가하고 실행합니다. 그것은 내 끝을 설정과 무언가가있을 수 있습니다.비록 내가 쓴 것이 다소 오도 된 것이라고 생각하기는하지만 초기 게시글을 더 명확하게 업데이트했습니다. 아직도 시간 내 주셔서 감사합니다! – Maurycy

관련 문제