2012-06-20 9 views
1

: 당신이 할 수있는,정규식 나는 마크 다운 문자열이 있다고 가정

* Bullet has [b]bold [code]*test[/code] part[/b]. [b]Another\nbold[/b] item. 

... 그리고 :

* Bullet has *bold [code]*test[/code] part*. *Another\nbold* item. 

을 그리고 난 같은 BBCode는로 변환 할 위에서 말하고, [code] 안에 있던 것을 보존하십시오. 나는 어떻게 이것을 성취 할 것인가?

배경

참조, 나는 FluxBB 포럼을 조정할 것을 시도하고있다. 기본적으로 BBCode를 허용합니다. 그러나 나는 또한 괄호와 기울임 꼴과 같은 멍청한 놈에 대한 Markdown의 작은 하위 집합을 허용하려고했습니다. 굵은 글자에 대한 적어도,이 같은 문으로 가능하다 :

$out = preg_replace('/\*(\S.*?\S)\*/s','[b]$1[/b]',$in); 

...하지만 너무 것을 번역하고 싶은 *test 부분에 문제가 있습니다.

답변

2

다음 코드가 작동하는 것 같습니다. preg_replace_callback()bin2hex()을 사용하여 보존 한 다음 pack()을 통해 다시 preg_replace_callback()을 통해 보관합니다.

$a = "* Bullet\n* Bullet has *bold [code]*test[/code] part*. *Another\nbold* item."; 
echo $a; 
echo "\n"; 
// PRESERVE CODE BLOCK 
$a = preg_replace_callback('/\[code\](.*?)\[\/code\]/s',create_function('$a','return "[code]" . bin2hex($a[1]) . "[/code]";'),$a); 
// HANDLE MARKDOWN FOR BOLD 
$a = preg_replace('/\*(\S.*?\S)\*/s','[b]$1[/b]',$a); 
// RESTORE CODE BLOCK 
$a = preg_replace_callback('/\[code\](.*?)\[\/code\]/s',create_function('$a','return "[code]" . pack("H*",$a[1]) . "[/code]";'),$a); 
echo $a; 
echo "\n";