2013-02-16 2 views
0

모든 문자열을 으로 변환하는이 javascript 함수는 완벽한 슬러그 (제 의견으로는)입니다. 나는 PHP로 변환 할 필요가 Javascript에서 PHP로 변환 함수

function slugGenerator(str) { 
    str = str.replace(/^\s+|\s+$/g, ''); 
    str = str.toLowerCase(); 

    var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; 
    var to = "aaaaeeeeiiiioooouuuunc------"; 
    for (var i=0, l=from.length ; i<l ; i++) { 
    str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); 
    } 
    str = str.replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '_').replace(/-+/g, '-'); 
    return str; 
} 

, 나는 시도하고 결과는 다음과 같습니다

function slugGenerator($str) { 
    $str = preg_replace('/^\s+|\s+$/g', '', $str); 
    $str = strtolower($str); 

    $from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; 
    $to = "aaaaeeeeiiiioooouuuunc------"; 

    for ($i = 0, $l = strlen($from); $i<$l ; $i++) { 
    $str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); 
    } 

    $str = preg_replace('/[^a-z0-9 -]/g', '', $str) 
    $str = preg_replace('/\s+/g', '_', $str) 

    $str = preg_replace('/-+/g', '-', $str); 
    return $str; 
} 

내가 루프이 문제를했습니다 :

for ($i = 0, $l = strlen($from); $i<$l ; $i++) { 

    // This string 
    $str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); 
} 

내가했습니다 PHP로 변환하는 방법에 대한 아이디어가 아니라 누군가 그것을 변환하려고 할 수 있습니까?

해결책 :strtr_unicode 기능을 추가하고이 스크립트를 사용 :

function slugGenerator($str) { 

    $str = preg_replace('/^\s+|\s+$/', '', $str); 
    $str = strtolower($str); 

    $from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; 
    $to = "aaaaeeeeiiiioooouuuunc------"; 
    $str = strtr_unicode($str, $from, $to); 

    $str = preg_replace(
     array("~[^a-z0-9 -]~i", "~\s+~", "~-+~"), 
     array("", "_", "-"), 
     $str 
    ); 

    return $str; 
} 
+2

여기에 누락 된 자료가 있습니까? 왜 당신이 정규식을 바꿀 때 정규 표현식을 만드는 이유는 무엇입니까? 'str.replace ([i]에서 [i]로)'는 충분하지 않아야합니까? – kjetilh

+1

PHP의'str_replace()'를 사용하십시오. 정규 표현식은 필요 없습니다. 배열을 입력으로 받아 들여'$ from'을'explode()'하고'str_replace()'에 넘깁니다. – gronostaj

+0

@kjetilh 아니요. 정규 표현식 및 전역 플래그가 없으므로 문자의 첫 번째 문자 만 바꿉니다. 그리고 자바 스크립트에서는 표준이 아니기 때문에 []를 사용하여 문자열에서 문자를 가져 오는 것은 구형 브라우저에서는 작동하지 않습니다. –

답변

2

모두 strtrstr_split 당신을 위해 작동하지 않습니다. 당신이 사용하고 싶다면 몇 가지 유용한 것들이 있습니다.

str_split_unicode : https://github.com/qeremy/unicode-tools.php/blob/master/unicode-tools.php#L145
strtr_unicode : https://github.com/qeremy/unicode-tools.php/blob/master/unicode-tools.php#L223

테스트 :

echo strtr_unicode("Hëëëy, hôw ärê yôü!", $from, $to); 
// outs: Heeey- how are you! 

그 후, 당신은 preg_replace에 대한 PARAM으로 배열을 사용할 수 있습니다;

$from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; 
$to = "aaaaeeeeiiiioooouuuunc------"; 
$str = strtr_unicode("Hëëëy, hôw ärê yôü!", $from, $to); 
echo $str ."\n"; 
// according to this line: 
// str = str.replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '_').replace(/-+/g, '-'); 
$str = preg_replace(
    array("~[^a-z0-9 -]~i", "~\s+~", "~-+~"), 
    array("-", "_", "-"), 
    $str 
); 
echo $str; 

출력;

 
Heeey- how are you! 
Heeey-_how_are_you- 
+0

감사합니다. strtr_unicode가 작동합니다. –

0

이 코드는 작동합니다 :

$str = preg_replace('/'.$from[$i].'/', $to[$i], $str); 
0

PHP 함수 않는 str_replace 배열 인수를 취할 수 있습니다. 당신이 배열에 $from$to 변환한다면, 당신은 사용할 수있을 것입니다 :

$str = str_replace($from, $to, $str); 

대신에 루프의, $str의 내부 $to에서 각각의 항목과 $from의 모든 발행 수를 교체하려면. $from을 변환하려면

$to 당신이 str_split을 사용할 수 신속하게 배열하기 : 코드를 유니 코드 문자를 포함 왜냐하면

$from = str_split($from); // meaning your original string from the question 
// same for $to 
+0

이 오류가 발생합니다 : PHP 구문 분석 오류 : 구문 오류, 예기치 않은 T_VARIABLE /var/www/slug.php의 15 행 이제는 귀하의 조언과 함께 편집 된 코드를 추가하겠습니다. –

+1

'strtr'가'str_replace'보다 권장되므로 체인 대체물을 얻지 못합니다. –

0

for 루프를 제거하십시오. strtr은 기본적으로 다음 작업을 수행하기 위해 만들어졌습니다.

$str = strtr($str, $from, $to);