У меня есть этот пункт:
<p>FIRST SECOND THIRD</p>
и я хочу обернуть второе слово в SPAN так:
<p>FIRST <span>SECOND</span> THIRD</p>
Если я это сделаю:
text.replace(/\s(\w+)\s/, '<span>$1</span>');
символы пробела до и после исчезновения слова. Зачем? Что я делаю не так? Я думал, что /\s(\w+)\s/
захватывает слово, но не пробелы.
Смотрите здесь: http://jsfiddle.net/simevidas/TpTzV/
Пробелы пропущены, потому что они являются частью всего матча. Захват - это то, что он помнит, чтобы заменить обратно на заменяющую строку через обратные ссылки.
Если JavaScript поддерживает оба запроса lookahead и lookbehind, вы можете сделать это:
text.replace(/(?<\s)(\w+)(?=\s)/, '<span>$1</span>');
Но это не так, поэтому вы можете попробовать захватить пробелы (отдельно от слова, которое вы обертываете), и вместо этого вернуть обратно:
text.replace(/(\s)(\w+)(\s)/, '$1<span>$2</span>$3');
$1 будет частью, захваченной бит, который вы заключили в круглые скобки, который является \w +, который будет состоять из слов, а не пробелов. Если вы хотите также захватить пробелы, сделайте следующее:
/(\s\w+\s)/
<span> SECOND </span>
с пробелами внутри тегов.
Пробелы исчезают, потому что не сгруппированы.
Попробуйте:
replace(/(\s\w+\s)/
Пространства (\s
) внутри группировки.
$1
представляет все совпадение, а не первые захватывающие скобки?$1
представляет первый захват. Весь матч обозначается символом$&
.