如何确保字符串被php中的脚本标记包围?

时间:2015-12-29 15:45:11

标签: php regex

我有这些想象中的字符串:

$txts=
  array('<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>',
        '<script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script>',
        'document.getElementById("demo").innerHTML = "Hello JavaScript!";');

现在我想要一个优雅的简单解决方案来检查<script></script>标签是否围绕字符串,如果没有,请用这些标签包围字符串。 因此,$txts[0]$txts[1]有效但$txt[2]应该包含<script> </script>

我脑子里有几个解决方案,但没有一个解决方案。对我来说,他们过于复杂或不干净。

你能提出一个合适的解决方案吗?

3 个答案:

答案 0 :(得分:1)

它必须是正则表达式解决方案吗?在阵列上循环并在必要时进行修复。确保最终有一个包含开放和结束标记的数组。

<?php
$txts=
  array('<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>',
        '<script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script>',
        'document.getElementById("demo").innerHTML = "Hello JavaScript!";');

$opentag = "<script";
$closingtag = "</script>";
for ($i=0;$i<count($txts);$i++) {
    if (strpos($txts[$i], $opentag) === false) $txts[$i] = $opentag.">".$txts[$i];
    if (substr($txts[$i], -(strlen($closingtag))) !== $closingtag) $txts[$i] .= $closingtag;
}
print_r($txts); // all entries have open and closing tags in the end
?>

答案 1 :(得分:0)

检查每个数组元素:

foreach($txts as $txt) {
        return is_int(strpos($txt, '<script')) && is_int(strpos($txt, '</script>')));
}

或通过功能:

function checkTags($beggining, $ending, $string)
{
     return is_int(strpos($string, $beggining)) && is_int(strpos($string, $ending)))
}

为每个元素调用函数

foreach($txts as $txt) {
   if(!checkTags('<script','</script>', $txt)) {
       //treat error case
   }
}

注意:使用了 is_int ,因为子字符串可能位于 0 (在您的情况下为开头)并且评估为 false

答案 2 :(得分:0)

/^<script[^<]*>/确保开始标记完整

/<\/script>$/确保结束标记在那里

我会这样做:

$txts = array(
    '<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>',
    '<script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script>',
    'document.getElementById("demo").innerHTML = "Hello JavaScript!";'
);

foreach ($txts as &$txt) {
    if (!preg_match('/^<script[^<]*>/', $txt)) {
        $txt = '<script>' . $txt;
    }

    if (!preg_match('/<\/script>$/', $txt)) {
        $txt = $txt . '</script>';
    }
}

var_dump($txts);

输出:

array(3) {
  [0]=>
  string(66) "<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>"
  [1]=>
  string(81) "<script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script>"
  [2]=>
  &string(81) "<script>document.getElementById("demo").innerHTML = "Hello JavaScript!";</script>"
}