2010-11-22 4 views
2

PHP/Regex : bbcode [s] 또는 [strike]에 대한 간단한 정규 표현식이 작동하지 않습니다.

바보 bbcode 파서 들어, 하나의 정의를 추가하려면 내 원래 정의가 preg_replace에 대한 것이었다 :

그리고이 작품, 나는 사용자가 [s] 또는 [strike] 중 하나를 사용하여 시작할 수 있기를 바랐다 그 형식으로 된 텍스트는 자연스럽게 추가되었습니다.

'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>' 

안타깝게도, [s][strike]가 모두 올바르게 사용되는 대신 기대했던 것 대신 실패합니다. s

왜 내면의 텍스트가 태그 이름으로 대체됩니까? 내 주변에 괄호를 추가하면 문제가 해결됩니까? 나는 아마이 모든 잘못하고있다 ..

+2

BBCode는 정기적으로하지 않습니다. [BBCode parser] (http://de3.php.net/manual/en/book.bbcode.php) – Gordon

+0

@ Gordon을 사용하십시오. 여러 가지 이유로이 프로젝트에서 정규 표현식을 사용하고 싶습니다. 나는 많은 필터링/etc 것들과 그것을 결합하고있다. – John

+0

@ 존 레직스 [황금 망치] (http://sourcemaking.com/antipatterns/golden-hammer). – Gordon

답변

3

두 개의 새로운 정규식 그룹을 열기 태그 (s|strike)에 추가하고 닫기 태그에 (s|strike)을 추가하는 것이 문제입니다. 따라서 결과 코드 안에 s 또는 strike이 표시됩니다. 올바른 그룹 번호 인 2을 사용하여 문제를 해결할 수 있습니다.

또 다른 방법은 처음에 ?:를 추가하여, 그 새 그룹을 비 참조을하는 것입니다,하지만 난 최초의 솔루션이 이해하기 쉽게 추측 :

#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si 
+0

아, 고맙다. 내 이해에 도움이된다. 나는'(. *?)'만이 그룹을 붙잡을 것이라고 생각했다. 나는'(무엇이라도)'역시 할 수 있다는 것을 완전히 잊었다. __EDIT__ : 첫 번째'(s | strike)'도 그룹을 만드나요? 두 번째 이유는 무엇일까요? 첫 번째 것은 \ 0입니까? 나를 혼란스럽게하지만, 잠이 든 후에 그것을 얻을 수 있습니다 : P – John

+0

모든'(..)'캡처 그룹 ('? :'으로 시작하지 않는 한). 그러나 그룹은'1'로 시작하는 번호가 매겨집니다. 왜냐하면''그룹 ''0 '은 일반적으로 일치하는 문자열 전체를 나타 내기 때문입니다 (이 경우''some text [/ s]'). – poke

+0

아 !! .. 이제는 나에게 완벽 해. 고마워요 :) – John

관련 문제