2012-11-30 5 views
0

URL을위한 슬러그를 만들려고합니다. 나는이 문자열에서 세 문자보다 작은 단어를 제거 할PHP : 단어에서 독일어 문자를 무시하고 문자열에서 작은 단어를 제거하십시오.

$kw='Test-Tes-Te-T-Schönheit-Test'; 

:

나는 다음과 같은 테스트 문자열이 있습니다.

그래서, 나는 출력이 코드 시도

$kw='test-tes-schönheit-test'; 

할 것을 권장합니다

$kw = strtolower($kw); 
$kw = preg_replace("/\b[^-]{1,2}\b/", "-", $kw); 
$kw = preg_replace('/-+/', '-', $kw); 
$kw = trim($kw, '-'); 
echo $kw; 

을하지만 결과는 다음과 같습니다 그래서

test-tes-sch-nheit-test 

, 독일의 문자 ö 문자열 에서 제거되고 독일어 단어 Schönheit이 두 단어로 취급됩니다.

해결 방법을 제안하십시오.

대단히 감사합니다.

답변

2

문자열이 UTF-8이 아닌 것으로 가정합니다. Umlauts/NON-ASCII 문자와 정규식으로 생각하면 UTF-8로 먼저 인코딩 한 다음 u-modifier (유니 코드)로 정규 표현식을 적용한 후 더 쉽게 인코딩 할 수 있습니다. 원래 인코딩이 필요하면 다시 로컬에서 디코딩하십시오. . 따라서 다음과 같이 시작하십시오 :

$kw = utf8_encode(strtolower($kw)); 

이제 regex-unicode 기능을 사용할 수 있습니다. \ p {L}은 문자를 나타내고 \ p {N}은 숫자를 나타냅니다.

[^\p{L}\p{N}] 

당신은 모든 단어 문자를 원하는 :

[\p{L}\p{N}] 

당신이 경우, 단어를 원하는 당신이 (당신까지) 단어 문자로 모든 문자와 숫자를 고려할 경우 경계는 반대 것 전에 시작 또는 경계가 있습니다.당신은 그것에 대해 긍정적 인 lookbehind을 사용할 수 있습니다

(?<=[^\p{L}\p{N}]|^) 

가 경계 또는 말에 따라 최대 2 "단어 문자를"대체 :

[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$) 

그래서 정규식은 다음과 같이 수 :

'/(?<=[^\p{L}\p{N}]|^)[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$)/u' 

그리고, 해당 지역에 디코딩 당신이 좋아하는 경우 :

echo utf8_decode($kw); 

행운을 빈다! Robert

1

귀하의 \b 단어 경계는 영숫자가 아니기 때문에 ö을 초과하여 이동합니다. 기본 PCRE는 ASCII 문자로 작동합니다.

입력 문자열은 UTF-8/Latin-1입니다. 같은 다른 영어 이외의 문자 기호를 치료하기 위해, /u Unicode modifer을 사용

$kw = preg_replace("/\b[^-]{1,2}\b/u", "-", $kw); 

내가 BTW preg_replace_callback 또는 /e를 사용하는 대신 교체하기위한 [A-Z]를 검색합니다. 그리고 대시의 경우 strtr이거나 연속 된 숫자의 접기의 경우에만 [-+]+입니다.

+0

안녕하세요, Mario, 당신이 쓴 : 나는 preg_replace_callback 또는/e btw를 사용하고 대신 [A-Z]를 검색하여 대체합니다. 그리고 대시를위한 strtr 또는 연속하는 것을 붕괴시키기위한 [+ +] +. 어떻게 보여 주시겠습니까? 감사. – Arnold

관련 문제