foreach in foreach覆盖结果

时间:2017-10-01 10:42:28

标签: php arrays foreach preg-match-all

这是我的PHP代码:https://eval.in/871659

1-我有一些带有javascript $content 第2行的HTML代码

2-我想将javascript代码提取到数组第17行

3-我有一些允许列表数组$allowed_js(可以在我的HTML上的javascript代码)第20行

4-我想删除不允许的javascript 第26 - 35行

问题出在第4部分,因为我在foreach中使用foreach,每个javascript $matches array检查为$allowd_js array,这是真的,

但问题是,如果它检测到不允许的字符串,它会得到替换字符串,所以基本上对于每个javascript,只有一个允许的字(包含在$allowed_js array中),所以在每种情况下它都会被替换

我也尝试使用break,但它无效

另外,我尝试了这个循环,但它也不起作用

$allow_count = count($allowed_js)-1;
foreach ($matches[0] as $key => $value) {
for ($i = 0; $i <= $allow_count ; $i++) {
        if (strpos($value,$allowed_js[$i]) == false) {
            $content = str_replace($value,"",$content);
            //break;
        }

    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用flag变量。请尝试下面的代码

<?php
$content = '<br>
<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<h1> some html codes</h1>
<script src="googlead.com/abc.js"></script>
<h2> etc </h2>
<script src="site1.com/sdfffe.js"></script>
<!-- comment -->
<script src="site2.com/something.js"></script>
<p>123</p>
<script src="site3.com/xyz.js"></script>
<script src="site4.com/qwerty.js"></script>
<script src="site5.com/sdfffe.js"></script>
';

# extract javascripts to array
preg_match_all('~<script.*?</script>~si',$content,$matches);


$allowed_js = array(
    "googlecode",
    "googlead"
    );


    foreach ($matches[0] as $key => $value) {
           $valid = 0;
        foreach ($allowed_js as $aval) {
            if (strpos($value,$aval) !== false) {
                #it's detected as allowed , so nothing to do
                $valid = 1;
            } 
        }
        if($valid == 0){
             $content = str_replace($value,"",$content);
        }
    }

echo $content;

DEMO