Здравствуйте!
Уже 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);