Как мне искать подстроку в строке и возвращать эту строку

#javascript #google-tag-manager

#javascript #google-tag-manager

Вопрос:

Я пытаюсь добавить следующую логику к приведенной ниже пользовательской переменной Javascript в GTM: «Найдите, содержит ли строка это слово, и верните это слово»

 function() {
  var el = {{Click Element}};
  el = el.parentElement;
  var classes = el.className;

  return classes ;
}
  

В приведенном выше коде переменная classes возвращает следующую строку:

 'wp-block-button jungle-cta tiger-animal'
  

Я пытаюсь сделать следующее: если строка содержит «tiger», тогда верните «tiger-animal» и только это.

Я применяю эту функцию к разным CTA на одной целевой странице. Каждый CTA имеет константу tiger как часть имени класса. Итак, один CTA — это «tiger-animal», другой «tiger-something», «tiger-word» и т.д. Я ищу логику, которая не зависит от того, что следует после «tiger-«. Если тигр найден, проанализируйте то слово, которое содержит тигра, и верните его.

Обновить:

Приведенное ниже работает сейчас! Спасибо.

 function() {
  var el = {{Click Element}};
  el = el.parentElement;
  var classes = el.className;
  var regex = /tiger-[a-z]*/g;
  var found = classes.match(regex);
  return found[0]
}
  

Комментарии:

1. не могли бы вы привести пример неудачного кода, который вы пробовали?

2. Я не знаю, почему каждый пользователь GTM здесь, в stackoverflow, настолько категоричен против использования встроенных функций GTM. Используйте таблицу регулярных выражений и передайте ее переменной класса, что позволит вам поддерживать регулярное выражение для каждого варианта использования, и вам не придется выполнять пользовательское кодирование.

Ответ №1:

Обновите код здесь, чтобы он соответствовал тому, что вы упомянули в комментарии. Теперь он возвращает строку, если совпадает, в противном случае возвращает undefined:

 function checkIfTiger(input) {
  const regex = /tiger-[a-z]*/g;
  const found = input.match(regex)
  return found !== null amp;amp; found[0]
}

checkIfTiger("fsd adfj adkfj tiger-adsf dfadf")
// returns "tiger-asdf"
  

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match

Как насчет использования свойства .includes . Например:

 let a = 'wp-block-button jungle-cta tiger-animal'

function checkIfTiger() {
  if(a.includes("tiger")) {
    return "tiger-animal"
  }
}

checkIfTiger()
  

На самом деле, вот версия с меньшим кодом. Он возвращает «tiger-animal», если «tiger» присутствует во всем, что вы проверяете, в противном случае возвращает false:

 let a = 'wp-block-button jungle-cta tiger-animal'

function checkIfTiger() {
  return a.includes("tiger") amp;amp; "tiger-animal"
}

checkIfTiger()
  

Комментарии:

1. Спасибо за информацию. Я забыл упомянуть, что я применяю эту функцию к разным CTA на одной целевой странице. Каждый CTA имеет константу tiger как часть имени класса. Итак, один CTA — это «tiger-animal», «tiger-something», «tiger-word» и т. Д. Я ищу логику, которая не зависит от того, что следует после «tiger-«. Если tiger найден, проанализируйте то слово, которое содержит tiger, и верните его.

2. Еще раз спасибо. Я попробовал вашу логику с моим существующим кодом, но GTM возвращает undefined . Обновлено описание.

3. Да, спасибо, что дали мне знать. Я не уверен насчет GTM. Я полагаю, вы имеете в виду менеджер тегов Google?

Ответ №2:

Если единственное важное изменение, которое вы хотите внести в эту функцию, заключается в том, что она вернет строку "tiger-animal" , если ваша переменная classes содержит подстроку "tiger" , тогда я рекомендую простой оператор if/else, который использует метод .includes() , который возвращает true , содержит ли ваша строка указанную подстроку, или false если она содержит указанную подстроку.не работает. Например:

 function() {
  var el = {{Click Element}};
  el = el.parentElement;
  var classes = el.className;
  
  if (classes.includes("tiger")) {
    return "tiger-animal";
  } else {
    return classes;
  }
}
  

И если вы не чувствуете, что это повредит удобочитаемости, троичный оператор использует меньше строк:

 function() {
  var el = {{Click Element}};
  el = el.parentElement;
  var classes = el.className;
      
  return (classes.includes("tiger") ? "tiger-animal" : classes)
}
  

Обе эти функции либо вернут classes , либо, если classes содержат подстроку "tiger" , вернут строку "tiger-animal" .

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

 function tigerChecker(string) {
      let classes = string
      
      if (classes.includes("tiger")) {
        return "tiger-animal";
      } else {
        return classes;
      }
    }
  

Комментарии:

1. Спасибо за информацию. Я забыл упомянуть, что я применяю эту функцию к разным CTA на одной целевой странице. Каждый CTA имеет константу tiger как часть имени класса. Итак, один CTA — это «tiger-animal», «tiger-something», «tiger-word» и т. Д. Я ищу логику, которая не зависит от того, что следует после «tiger-«. Если tiger найден, проанализируйте то слово, которое содержит tiger, и верните его.