const faq = "<p><ul>\n<li>• Download the App from <a href=\"https://itunes.apple.com/US/app?mt=8%29\" target=\"_blank\">AppStore</a> or <a href=\"https://play.google.com/store/apps/details?id=\" target=\"_blank\">Google Store</a></li>\n <li>• Issue a virtual card within the app</li></ul>.</p>"
new RegExp(`(?!<a[^>]*?>)(${searchText})(?![^<]*?</a>)`, 'gi')
<a[^>]*?>
писать не рнкомендую, лучше <a[^<>]*?>
мало ли где может быть 2 раза открытый тэг. Я в таких случаях всегда страхуюсь, хотя конкретно в этом случае допускаю, что может быть не критично, а игнорирует, потомучто у вас внутри ссылки найдет только если текст сразу за тэгом идет. если можно просто заменить в массивеВ том-то и дело, что не просто, в чём вы уже убедились. Иначе бы и вопроса этого не было.
у меня есть массив с данными, где нужно заменить, зачем мне обращаться к DOM?Затем, что это самый подходящий инструмент для вашей задачи. Речь, разумеется, не про то, чтобы отрендерить данные на странице, а потом их получить обратно - постройте параллельный DOM в памяти и никакой React вам не помешает.
мне удобнее добавить к текущему методу дополнительный map для выделения словНу, это уже вопрос организации кода. Никто же не мешает мой код выделить в метод и передать этот метод в map.
очень затратный, ведь DOM штука медленнаяВот тут вы заблуждаетесь. Затратно и медленно работать с большими деревьями, которые добавлены в основной документ. В данном случае они точно не рендерятся на странице и, как я понимаю, не являются очень большими.