Anderseno
@Anderseno
Автоматизация рулит!

PHP -> Регулярные выражения -> Как найти лишнее в коде?

Здравствуйте!

Уже 3 дня ломаю голову. В регулярках разбираюсь хорошо, но вот эту задачу решить не могу. Вообщем суть такая, есть 2 html кода, один из файла, а другой из браузера.

Тот html код, что из браузера может отличаться, т.к. скрипты дописывают свои теги в DOM.

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

Наглядный пример:

html-код из файла:
<ul class="socials">
                            <li><a class="facebook" href="#"></a></li>
                            <li><a class="twitter" href="#"></a></li>
                            <li><a class="googleplus" href="#"></a></li>
</ul>


html-код в браузере, после того, как скрипты добавили свои стили:
<ul class="socials screen">
                            <li style="position: absolute; top: 10px;"><a class="facebook" href="#"></a></li>
                            <li style="position: absolute; top: 30px;"><a class="twitter" href="#"></a></li>
                            <li style="position: absolute; top: 50px;"><a class="googleplus" href="#"></a></li>
</ul>


В итоге, нужно сравнить 2 этих html-кода, и на выходи получить массив, что на что нужно заменить во втором коде, чтобы привести его к первоначальному виду.

Т.е. так:
[<ul class="socials screen">] => <ul class="socials">
[<li style="position: absolute; top: 10px;">] => <li>
[<li style="position: absolute; top: 30px;">] => <li>
[<li style="position: absolute; top: 50px;">] => <li>


Далее, имея этот массив можно сделать замену и все получится.

вот пример, запустите попробуйте

@header('Content-Type: text/plain; charset=utf-8');
$sourse = '
<div id="logo" class="234234234">
<a href="#" title="Site Title">
<p>3</p> 
<span>Your Site Title</span>
</a>
</div>
<ul class="isotope" style="position: relative; overflow: hidden; height: 360px;" id="screens">
<li style="position: absolute; left: 0px; top: 0px;" class="screen usage isotope-item">
<a href="images/sample_showcase/640x480_usage.png" class="boxer" rel="gallery" title="Photo">
<img src="images/sample_showcase/140x140_usage.png" alt="Shot 1">
<div></div>
</a>
</li>
</ul>   
';
                            
                            
$sourse_php = '
<div id="logo">
<a href="#" title="Site Title">
<span>Your Site Title</span>
</a>
</div>
<ul id="screens">
<li class="screen usage">
<a href="images/sample_showcase/640x480_usage.png" class="boxer" rel="gallery" title="Photo">
<img src="images/sample_showcase/140x140_usage.png" alt="Shot 1" />
<div></div>
</a>                                
</li>
</ul> 
';


function strsoot($sourse_php){
$sourse_php = trim($sourse_php);
//$sourse_php = preg_replace('#([\s]{1,})#siu', ' ', $sourse_php);
$sourse_php = str_replace('/', '\/', $sourse_php);
$sourse_php = str_replace("'", "\'", $sourse_php);
$sourse_php = str_replace(".", "\.", $sourse_php);
$sourse_php = str_replace('$', '\$', $sourse_php);
$sourse_php = str_replace("^", "\^", $sourse_php);
$sourse_php = str_replace("?", "\?", $sourse_php);
$sourse_php = str_replace('*', '\*', $sourse_php);
$sourse_php = str_replace("!", "\!", $sourse_php);
$sourse_php = str_replace("#", "\#", $sourse_php);
$sourse_php = str_replace("№", "\№", $sourse_php);
$sourse_php = str_replace(":", "\:", $sourse_php);
$sourse_php = str_replace("+", "\+", $sourse_php);

return trim(preg_replace_callback('#(<[^>]*?>)#msiu', 'recode', $sourse_php));
}

function recode($sourse_ph){
    $sourse_ph = $sourse_ph[0];
    //$sourse_ph = preg_replace('#([\s]{2,})#msiu', ' ', $sourse_ph);
    $sourse_ph = str_replace(' ', '(.*?)', $sourse_ph);
    $sourse_ph = str_replace('>', '>(.*?)', $sourse_ph);
    $sourse_ph = str_replace('<', '<(.*?)', $sourse_ph);
    $sourse_ph = str_replace('"', '(.*?)"(.*?)', $sourse_ph);
    $sourse_ph = str_replace('(.*?)(.*?)(.*?)', '(.*?)', $sourse_ph);
    $sourse_ph = str_replace('(.*?)(.*?)', '(.*?)', $sourse_ph);    
    if (substr($sourse_ph, -5, 5) == '(.*?)') $sourse_ph = substr($sourse_ph, 0, (strlen($sourse_ph)-5));
    return trim($sourse_ph);     
}



$match_php = explode("\n", trim($sourse_php));


$match = explode("\n", trim($sourse));


foreach($match as $n=>$str){
    if (preg_match('/'.preg_quote($str, '/').'/msiu', trim($sourse_php))){
    }
    else{
        $reg_so[trim($str)] = strsoot($str);
    }
}

foreach($match_php as $n=>$str){
    if((preg_match('/'.strsoot($str).'/msiu', trim($sourse))) and (!preg_match('/'.preg_quote($str, '/').'/msiu', trim($sourse)))){
        $reg[trim($str)] = trim(strsoot($str));
    }
}

foreach($reg_so as $k=>$v){
    
    foreach($reg as $n=>$s){
        if(preg_match('/'.$s.'/msiu', trim($k))){
            $reg_so[$k] = $n;
        }else{
            $reg_so[$k] = $n.'delete';
        }    
    }
     
}

echo '$n=>$str
';
print_r($reg);
echo '
$k=>$v
';
print_r($reg_so);
  • Вопрос задан
  • 2646 просмотров
Пригласить эксперта
Ответы на вопрос 4
Странная задача... Интересно - зачем?
А так - регулярками это не решается. Используйте diff или какой-нибудь редактор с возможностью сравнения.
Ответ написан
Комментировать
Anderseno
@Anderseno Автор вопроса
Автоматизация рулит!
когда в wisywig редакторе правишь контент, а в нем есть JS или yandex.maps например, тогда они дописывают лишние теги. вот их надо убрать.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Все просто - для таких задач регулярки не подходят. Для обработки и фильтрации HTML лучше применить обход DOM дерева. Способ этот намного более надежный и простой.

Если хотите знать подробнее почему регулярки не подходят, предлагаю почитать вот это: habrahabr.ru/post/171667
Ответ написан
KorsaR-ZN
@KorsaR-ZN
Попробуйте класс PHPDiff, он выдает массив различных строк, т.е можете потом из одного файла заменить строку во втором, тем самым привести их к одному виду или эту
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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