2011-09-20 4 views
0

내가 내부 콘텐츠 등을 위키 스타일의 링크를 사용하려고하는 사이트를 개발하고 있어요 링크 [[페이지 이름]]정규 표현식

을 나는 정규식을 작성하려고 해요 이를 달성하기 위해 링크로 바꾸고 공백을 대시 (대문자 라기보다는 공간 대용 문자)로 바꾸는 것까지 있지만 두 단어로 된 페이지 이름에 대해서만 사용합니다.

모든 가능한 수의 단어에 대해 별도의 정규 표현식을 쓸 수는 있지만 (10 아래쪽에서 말하면 됨) 분명히할만한 방법이있을 것입니다.

는 여기이 순간에이 작업은 다음과 같습니다

$regex = "#[\[][\[]([^\s\]]*)[\s]([^\s\]]*)[\]][\]]#"; 
$description = preg_replace($regex,"<a href=\"/$1-$2\">$1 $2</a>",$description); 

사람이 정말 도움이 될 것 단어의 수를 작동 그래서이 정규식을 수정하는 방법을 나에게 조언을 할 수 있습니다.

답변

1

당신은 (preg_replace_callback 사용) 대체 할 수있는 콜백 함수를 사용해야합니다

$str = preg_replace_callback('/\[\[([^\]]+)\]\]/', function($matches) { 
    return '<a href="' . preg_replace('/\s+/', '-', $matches[1]) . '>' . $matches[1] . '</a>'; 
}, $str); 
+1

그것은 익명 함수는 PHP <5.3.0 – meagar

2

당신은 대체 문자열을 처리하는 콜백을 받아들이는 preg_replace_callback() 기능을 사용할 수 있습니다. 문자 클래스 내에서 많은 부정 대신 패턴에 lazy quantifiers을 사용할 수도 있습니다.

외부 preg_replace_callback은 일치하는 텍스트를 추출하여 적절하게 수정 된 버전을 반환하는 콜백 함수에 전달합니다.

$str = '[[Page Name with many words]]'; 

echo preg_replace_callback('/\[\[(.*?)\]\]/', 'parse_tags', $str); 

function parse_tags($match) { 
    $text = $match[1]; 
    $slug = preg_replace('/\s+/', '-', $text); 
    return "<a href=\"$slug\">$text</a>"; 
} 
+0

에서 작동하지 않습니다 주목할 가치가있다 당신은 닫는 괄호를 탈출해야하지 않는다; '\ [\ [...]]'는 완벽하게 유효합니다. – meagar