2012-03-09 3 views
0

나는 알아낼 수없는 간단한 정규 표현식 문제가있는 것 같습니다! 지금까지 내가 시도한 것입니다Regex/Preg_replace, 검색 지점 변경

<text title="a"> 
text1 
</text> 

<text title="b"> 
text2 
</text> 

<text title="c"> 
text3 
</text> 

:

preg_replace ('/##(.*?)##(.*?)##/s', '<text title="$1">$2</text>==', $data); 

## a ## 
text1 
## b ## 
text2 
## C## 
text3 

이 내가 마무리 할 것입니다 :

내가로 시작하는 표현이다

내가 겪고있는 문제는 마지막 경기가 끝날 때부터 preg_replace가 검색을 다시 시작한다는 것입니다. 변경할 방법이 있습니까? 이?

내 전략이 끔찍한 경우이를 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

식의 마지막 ##은 첫 번째 일치 항목에서 소비되므로 다음 일치 항목과 일치하지 않습니다.

미리보기를 사용하면이를 피할 수 있습니다.

/##(.*?)##(.*?)(?=##)/s 

그러나 당신은 아마 뭔가를 원하는 : 그래서 같이 Qtax는 지적

/^## *([^#]+?) *##$(.*?)(?=^##[^#]+##$|\z)/ms 
+0

감사합니다. 이 작업을 성공적으로 사용할 수 있었고, @Alan Moore가 지적한 마지막 경기의 특별한 경우를 처리하기 위해 추가 라인을 추가해야했습니다. – ThreepwoodG

0

각 경기는 다음 경기 있었어야에서 ##를 소비한다. 미리보기로 전환하는 것이 도움이되지만 마지막 경기의 특별한 경우를 처리해야합니다. 하지만 나는 심지어 당신이 을 봐야한다고 생각하지 않는다. 다음 줄에서을 보게되면 훨씬 덜 소비한다. 이 체크 아웃 :

$result = preg_replace('/^## *(.*?) *##\s+(.*)/m', 
         "<text title='$1'>\n$2\n</text>\n", 
         $subject); 

는 여기 demo입니다.

가장 중요한 변경 사항은 s 수정자를 삭제하는 것이 었습니다. 개행이 개행과 일치해야하는 곳은 단 하나 뿐이므로 \s+을 사용하고 있습니다. s 수정자가 없으면 두 번째 줄을 사용하는 데 안전하게 (.*)을 사용할 수 있습니다. 그리고 보너스로, 나는 (.*?)이 첫 번째 라인의 제한을 벗어날 수 없다는 것을 안다. (입력이 잘못된 경우에만 발생한다.)