2016-12-01 3 views
0

У меня есть следующие ссылки:Заменить часть ссылки

http://example.com/item/[{catalogueId:[0-9]}/key/[{translationId:[a-z]}]]/ 

в объект У меня есть ценности, которые я должен поставить в этой ссылке:

args: {catalogueId: 12, translationId: "en"} 

Теперь я хочу ссылку, чтобы посмотреть этот :

http://example.com/item/12/key/en/ 

Но когда объект выглядит следующим образом:

args: {catalogueId: 12} 

Ссылка должна выглядеть следующим образом:

http://example.com/item/12/key/ 

И если объект является пустой 12 и key должны быть исключены из ссылки тоже.

Скобки решают, что будет показано в ссылке. Вставка в скобки catalogueId будет отображаться только в том случае, если в объекте присутствует catalogueId.

Я уже выполнена, чтобы заменить параметры между фигурными скобками этой функцией:

for(var key in this.args) { 
    var regex = new RegExp('{' + key + '\\b[^}]*}', 'g'); 
    this.pattern = this.pattern.replace(regex, this.args[key]); 
} 

Но я понятия не имею, как сделать часть скобок

+0

@epascarello Я добавил, что у меня уже есть, но я понятия не имею, как я могу сделать часть скобок. –

+0

Зачем вам заменять строку, если вы знаете шаблон, не можете ли вы просто ее создать? – epascarello

+0

@epascarello потому что ссылка тоже переменная. Ничто не жестко закодировано. –

ответ

1

В соответствии с вашими новыми требованиями Я обновил решение. Это не очень хорошо, но он работает, я думаю, что это может быть излишним, когда вы можете просто удалить скобки массива и вырезать строку, где она не сможет выполнить замену.

Оставьте заявку на комментарий.

const url = 'http://example.com/item/[{catalogueId:[0-9]}/key/[{translationId:[a-z]}]]/' 
 

 
const REGEX = { 
 
    type: /\[([0-9-a-z]+)\]/g,  // [type] 
 
    brackets: /\[|\]/,    // [|] 
 
    keyType: /\{(\w+)\:([^\}]+)\}/, // {key:[type]} 
 
    placeholder: /\{[^\}]+\}/g  // the entire {placeholder} 
 
} 
 

 
function test(url, params) { 
 
    // split the url into it's compontent parts 
 
    const parts = url.replace(REGEX.type, '($1)') 
 
    .split(REGEX.brackets) 
 
    .filter(str => str !== '') 
 
    
 
    const ret = [] 
 
    
 
    for (let ii = 0; ii < parts.length; ii++) { 
 
    // find the key and type 
 
    const matches = parts[ii].match(REGEX.keyType) 
 
    if (matches == null) { 
 
     // no placeholders in this section, just add it to the return 
 
     ret[ii] = parts[ii] 
 
    } 
 
    else { 
 
     const [match, key, type] = matches 
 
     if (typeof params[key] !== 'undefined') { 
 
     // replace the placeholder with the provided value 
 
     ret[ii] = parts[ii].replace(REGEX.placeholder,() => { 
 
      // you could do param type checking here 
 
      return params[key] 
 
     }) 
 
     } 
 
     else { 
 
     // this iterations placeholder doesn't match, time to quit 
 
     break 
 
     } 
 
    } 
 
    } 
 
    // if we get through the loop return the url 
 
    return ret.join('') 
 
} 
 

 
const tests = [ 
 
    // it should accept no params 
 
    test(url, {}), 
 
    // it should not include placeholders that are missing 
 
    test(url, { 
 
    catalogueId: 10 
 
    }), 
 
    // it should fill in all placeholders 
 
    test(url, { 
 
    catalogueId: 10, 
 
    translationId: 'test' 
 
    }), 
 
    // it should not skip placeholders 
 
    test(url, { 
 
    translationId: 'test' 
 
    }), 
 
    // it should not error with invalid params 
 
    test(url, { 
 
    invalid: 'param' 
 
    }) 
 
] 
 

 
tests.map(result => console.log(result))
<script src="https://codepen.io/synthet1c/pen/WrQapG.js"></script>

Я должен был избавиться от скобок массива, как это было слишком сложно, чтобы получить регулярное выражение для работы с ними без кучи кода. но это сделает то же самое, удалив любые заполнители, которые не совпадают.

const test1 = { 
 
    catalogueId: 12, 
 
    translationId: "en" 
 
} 
 

 
const test2 = {catalogueId: 12} 
 

 
const url = 'http://example.com/item/{catalogueId:[0-9]}/key/{translationId:[a-z]}/' 
 

 
const reg = /\{([^:]+):(\[[^\]]+\])\}/g 
 

 
const replace = url => components => { 
 
    // replace all the placeholders in the url 
 
    const replaced = url.replace(reg, (_, key, type) => { 
 
    return components[key] 
 
    }) 
 
    // clean off any missing values 
 
    const cutIndex = replaced.indexOf('undefined') 
 
    
 
    return cutIndex < 0 
 
    ? replaced 
 
    : replaced.substr(0, cutIndex) 
 
} 
 

 
console.log(
 
    replace(url)(test1) // 'http://example.com/item/12/key/en/' 
 
) 
 
console.log(
 
    replace(url)(test2) // 'http://example.com/item/12/key/' 
 
)
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>

+0

OP подтвердил в комментарии, что их строка формата правильно цитируется в вопросе, и они не могут ее изменить. –

Смежные вопросы