JQuery - Использование регулярного выражения для выделения образца ссылки жирным шрифтом

У меня есть список с датами, и я пытаюсь использовать jQuery и регулярные выражения, чтобы выделить каждую дату в ссылке жирным шрифтом. Вот что у меня получилось:

$date = '/([0-2][0][0-9][0-9]).([0-1][0-9]).([0-3][0-9])/gi';

$('a:contains('+$date+')').css('font-weight','600');
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul>
  <li>
    <a href = "#">2018.03.08 Event #1</a>
  </li>
  <li>
    <a href = "#">2018.02.12 Event #2</a>
  </li>
  <li>
    <a href = "#">2017.12.04 Event #3</a>
  </li>
</ul>

Что не так с моим кодом? Есть лучший способ это сделать?

Я новичок в JS / jQuery, поэтому большое вам спасибо за любую помощь!

Если код jQuery не работает, лучше всего прочитать документацию по используемому jQuery; :contains() ищет строку текста в предоставленных элементах, чтобы отфильтровать эту коллекцию. Требуется только строка, а не объект регулярного выражения.

David says reinstate Monica 01.07.2018 14:22

Вы пробовали установить значение font-weight 700 вместо 600? Я считаю, что 700 - это жирный эквивалент жирного шрифта.

Fillard Millmore 01.07.2018 14:23

@DavidThomas О, большое спасибо! Может быть, у вас есть подсказка, как я могу выполнить то, что пытаюсь сделать?

Kevin M. 01.07.2018 14:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
74
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы используете jQuery, вот решение, ориентированное на это:

var pattern = /([0-2][0][0-9][0-9])\.([0-1][0-9])\.([0-3][0-9])/;

// select each `a` element
$('a').each(function () {  
  // store individual `a` elements
  var elem = $(this);  
  // replace the text (date in your case) using the regex pattern and  
  // set the content of the `a` element with the new, formatted date
  elem.html(elem.text().replace(pattern, function (date) {
    // here you can apply your various inline styles
    return '<span style = "font-weight: 600">' + date + '</span>';
  }));
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>
    <a href = "#">2018.03.08 Event #1</a>
  </li>
  <li>
    <a href = "#">2018.02.12 Event #2</a>
  </li>
  <li>
    <a href = "#">2017.12.04 Event #3</a>
  </li>
</ul>

В вашем случае вам не нужен модификатор i в вашем регулярном выражении, поскольку ваш шаблон регулярного выражения не должен обрабатывать символы, чувствительные к регистру, а только числа.

Кроме того, вам не нужен модификатор g, так как в вашем конкретном случае, исходя из вашего примера, вам нужно сопоставить шаблон один раз.

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

Kevin M. 01.07.2018 14:37
Ответ принят как подходящий

Во-первых, решение проблемы:

// a date-pattern regular expression literal:
let datePattern = /([0-2][0-9]{3,3}\.[0-1][0-9]\.[0-3][0-9])/gi;

// select all <a> elements,
// and iterate over the returned collection with the
// .html() method:
$('a').html(function() {

  // here we return the modified string of text,
  // wrapping any patterns matching the date pattern,
  // with the '<b>' and '</b>' tags; as this text is
  // returned to the HTML method this is parsed as
  // HTML:
  return this.textContent.replace(datePattern, '<b>$1</b>');
});

let datePattern = /([0-2][0-9]{3,3}\.[0-1][0-9]\.[0-3][0-9])/gi;

$('a').html(function() {
  return this.textContent.replace(datePattern, '<b>$1</b>');
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul>
  <li>
    <a href = "#">2018.03.08 Event #1</a>
  </li>
  <li>
    <a href = "#">2018.02.12 Event #2</a>
  </li>
  <li>
    <a href = "#">2017.12.04 Event #3</a>
  </li>
</ul>

Также стоит отметить, что, хотя jQuery и делает могут упростить некоторые вещи, описанное выше просто сделать с помощью обычного JavaScript:

let datePattern = /([0-2][0-9]{3,3}\.[0-1][0-9]\.[0-3][0-9])/gi;

// converting the result of the contained expression
// into an Array, in order to gain access to Array methods:
Array.from(

  // retrieving all <a> elements from the document:
  document.querySelectorAll('a')

// using Array.prototype.forEach() to iterate over
// the Array of <a> elements:
).forEach(function(aElement) {
  // 'aElement' refers to the current <a> element
  // of the Array of <a> elements.

  // here we update the innerHTML of the current <a> element
  // to be equal to the text of the current <a> element, after
  // wrapping any date-patterns - as before - with the '<b>'
  // and '</b>' tags:
  aElement.innerHTML = aElement.textContent.replace(datePattern, '<b>$1</b>');
});

let datePattern = /([0-2][0-9]{3,3}\.[0-1][0-9]\.[0-3][0-9])/gi;

Array.from(
  document.querySelectorAll('a')
).forEach(function(aElement) {
  aElement.innerHTML = aElement.textContent.replace(datePattern, '<b>$1</b>');
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul>
  <li>
    <a href = "#">2018.03.08 Event #1</a>
  </li>
  <li>
    <a href = "#">2018.02.12 Event #2</a>
  </li>
  <li>
    <a href = "#">2017.12.04 Event #3</a>
  </li>
</ul>

А теперь к проблемам:

$date = '/([0-2][0][0-9][0-9]).([0-1][0-9]).([0-3][0-9])/gi';

Здесь вы объявили глобальную переменную (плохая практика, поскольку эта глобальная переменная может быть использована / перезаписана в другом месте непредсказуемо). Также регулярное выражение было заключено в строковый литерал, что означает, что регулярное выражение является строкой, а не регулярным выражением вообще.

Кроме того, селектор :contains() работает только со строками, как ясно сказано в документации.

Итак, в исходном коде у вас была строка (которая выглядела как регулярное выражение), которую искали, но не нашли ни в одном из элементов <a>.

Кроме того, если бы было обнаружено, что конечным результатом вызова вашего метода css() было бы обертывание самого элемента <a> в элементе <b>, а не обертывание строки даты. Я думаю, это был твой план.

Рекомендации:

спасибо и большое спасибо за объяснение вашего кода. это помогает мне понять, как работает логика jQuery.

Kevin M. 01.07.2018 14:41

Добро пожаловать, я рада, что мне помогли :)

David says reinstate Monica 01.07.2018 14:42

@DavidThomas, хороших и изящных решений, поздравляю их. ;)

user7637745 01.07.2018 15:11

Простое и хорошее решение:

var regex = new RegExp("[0-9]"); // expression here

$("a").filter(function () {
    return regex.test($(this).text()); 
}).css('font-weight','100');

Другие вопросы по теме