Задать вопрос
Mouvdy
@Mouvdy

Как правильно изменить JS для одновременного выполнения всех условий?

Приветствую,

Имеется массив:
$links = array(
    
	/* Mobil 1 New Life 0W40 */
	array('word' => array('Mobil1 0w-40'
	), 'link' => 'http://site.com/catalog/Mobil1_New_Life_0W40'),
    	  
	/* Mobil1 New Life 5W-30 */
	array('word' => array(
	'Mobil1 5w-30'
	), 'link' => 'http://site.com/catalog/Mobil1_New_Life_5W30'),
   
   /* Mobil Super 3000 5W-40 */
	array('word' => array('Mobil Super 3000 5w-40'
	), 'link' => 'http://site.com/catalog/Mobil_Super_3000_5W40'),
	
	/* Mobil Super 3000 FE 5W-30 */
	array('word' => array('Mobil Super 3000 FE 5w-30'
	), 'link' => 'http://site.com/catalog/Mobil_Super_FE_5W30')
	
    );


И JS код:

(function(funcName, baseObj) {
    funcName = funcName || "docReady";
    baseObj = baseObj || window;
    var readyList = [];
    var readyFired = false;
    var readyEventHandlersInstalled = false;
    function ready() {
        if (!readyFired) {
            readyFired = true;
            for (var i = 0; i < readyList.length; i++) {
                readyList[i].fn.call(window, readyList[i].ctx);
            }
            readyList = [];
        }
    }
    function readyStateChange() {
        if ( document.readyState === "complete" ) {
            ready();
        }
    }
    baseObj[funcName] = function(callback, context) {
        if (readyFired) {
            setTimeout(function() {callback(context);}, 1);
            return;
        } else {
            readyList.push({fn: callback, ctx: context});
        }
        if (document.readyState === "complete") {
            setTimeout(ready, 1);
        } else if (!readyEventHandlersInstalled) {
            if (document.addEventListener) {
                document.addEventListener("DOMContentLoaded", ready, false);
                window.addEventListener("load", ready, false);
            } else {
                document.attachEvent("onreadystatechange", readyStateChange);
                window.attachEvent("onload", ready);
            }
            readyEventHandlersInstalled = true;
        }
    }
})("docReady", window);
docReady(function(){
    var dat = <?=json_encode($links)?>;
    dat.forEach(function(lv){
        if(lv.word instanceof Array) {
            lv.word = lv.word.join('|'); 
        }
        var expr = new RegExp('(?!<a.*>.*)('+lv.word+')(?!.*</a>)', 'i');
        document.body.innerHTML = document.body.innerHTML.replace(expr, '<a target="_blank" href="'+lv.link+'?aff=<? echo $_GET['aff'];?>">$1</a>');        
    });
});


Который соответственно после выплнения php приобретает вид:
...
var dat = [{"word":["Mobil1 0w-40"],"link":"http:\/\/site.com\/catalog\/Mobil1_New_Life_0W40"},{"word":["Mobil1 5w-30"],"link":"http:\/\/site.com\/catalog\/Mobil1_New_Life_5W30"},{"word":["Mobil Super 3000 5w-40"],"link":"http:\/\/site.com\/catalog\/Mobil_Super_3000_5W40"},{"word":["Mobil Super 3000 FE 5w-30"],"link":"http:\/\/site.com\/catalog\/Mobil_Super_FE_5W30"}];


Что собственно говоря делает код: он находит подходящие в тексте страницы из $links ключевые слова и к ним проставляется ссылки.

Проблема в том, что в JS в зависимости от расположения условия - выполняются условия не одновременно а по порядку

7acae958ce9d464a8a0d79b3b364876a.png

Соответственно если поменять местами, то будет проставляться на другие.

Как сделать чтобы работало "одновременно" ?
  • Вопрос задан
  • 203 просмотра
Подписаться 1 Оценить 15 комментариев
Решения вопроса 1
@RoverWhite
Насколько я вижу, Ваш код должен бы работать корректно вне зависимости от расположения ключевых слов.
Единственное что может ему помешать, это вот это регулярное выражение
var expr = new RegExp('(?!<a.*>.*)('+lv.word+')(?!.*</a>)', 'i');

Во первых надо бы добавить модификатор m чтобы оно поддерживало многострочность
Во вторых вот в этом куске ?!.* надо бы обрезать жадность квантификаторов ?!.*?
И вот тут тоже <a.*>.* становиться <a.*>.*?
php.net/manual/pl/regexp.reference.repetition.php
Возможно причина именно в жадности квантификаторов?
Также данный код отработает только первое совпадение, чтобы отработать все надо добавить модификатор "g".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы