2016-09-03 4 views
0

У меня есть эта функция в PHP:JavaScript Regex не заменяет, как и ожидалось

function sanitizeKey($str){ 
    $str = strtolower($str); 
    $str = preg_replace('/[^\da-z ]/i', '', trim(ucwords($str))); 
    $str = str_replace(" ", "", $str); 
    $str = lcfirst($str); 
    return $str; 
} 

При запуске против Manufacture's P/N выход является manufacturesPn.

Я перезапись ту же функцию в JavaScript, и до сих пор этот код:

str = "Manufacture's P/N"; 

str = str.toLowerCase() 
    .replace(/\b[a-z]/g, function(letter) { // php's ucwords 
    return letter.toUpperCase(); 
    }); 
str = str.trim(); // remove leading & trailing whitespace 
str = str.replace("/[^\da-z ]/i", ''); // keep alphanumeric 
str = str.replace(/\s+/g, ''); // remove whitespace 
str = str.replace(/\b[a-z]/g, function(letter) { // php's lcfirst 
    return letter.toLowerCase(); 
}); 

console.log(str); 

На данный момент, если я вход Manufacture's P/N токовый выход Manufacture'SP/N.

Вопрос Как изменить код JavaScript для репликации PHP-программы, чтобы он выдавал тот же результат для одного и того же ввода?

+1

@whoever Если вы используете downvote, пожалуйста, будьте любезны, чтобы объяснить, почему. – 3zzy

ответ

1

Вы можете использовать:

str = "Manufacture's P/N"; 
 
    
 
console.log(
 
str.trim() 
 
.toLowerCase() 
 
.replace(/[^\da-z ]+/gi, '') 
 
.replace(/(?!^)\b[a-z]/g, function(c) { 
 
    return c.toUpperCase(); 
 
}) 
 
.replace(/\s+/g, '') 
 
) 
 
    
 
//=> "manufacturesPn"

В Javascript вы не должны указывать регулярное выражение, например. "/[^\da-z ]/i" и использовать глобальный флаг для замены в глобальном масштабе.

+1

Aaah! Большое спасибо, я ждал объяснений. – 3zzy

+0

'(? ^)' - отрицательный lookahead, чтобы пропустить начальный символ, заглавными. – anubhava

-1

Если ваша задача состоит в том, чтобы удалить некоторые символы из строки просто сделать что-то вроде этого, вместо того, чтобы использовать регулярные выражения (C# псевдо-код):

var result = ""; 

foreach (var ch in str) 
    if (char.isLetterOrDigit(ch)) 
     result += ch; 

Это быстрое, чистое и очень очевидный код, который может быть легко расширена для ваших нужд

+0

Нет. Я хочу портировать эту функцию PHP точно в JS, чтобы результат был идентичным. – 3zzy

+0

@ 3zzy, что может быть довольно сложно из-за слегка различной реализации регулярных выражений на каждой платформе. Мой совет - перепишите точную логику этого кода без выражений. –

1

Вы можете соответствовать каждый использование символов .test(), .indexOf() в .replace() функции

var str = "Manufacture's P/N"; 
 

 
var res = str.replace(/./g, function(p) {  
 
    return /[a-z]/i.test(p) && !/\s/.test(str[str.indexOf(p) - 1]) 
 
     ? p.toLowerCase() : /['/ ]/.test(p) ? "" : p 
 
}); 
 

 
console.log(res);

1

Пожалуйста, попробуйте это.

str = "Manufacture's P/N"; 

str = $.trim(str).split(" "); 
str1 = str[0].toLowerCase().replace("'", ''); 
str2 = str[1].toLowerCase().replace("/", ''); 
str3 = str2.charAt(0).toUpperCase() + str2.slice(1); 
finalString = str1 + str3; 

return finalString; 

console.log(finalString); 
Смежные вопросы