2013-11-22 36 views
1

我想單獨內嵌腳本標籤分開:正則表達式 - 使preg_split越來越內嵌腳本標籤

<script> 
    console.log('hello'); 
    console.log('hi!'); 
    console.log('yo!'); 
</script> 
<script type="text/javascript"> 
    console.log("this is another inline script"); 
    var hi = "cool"; 
    console.log(hi); 
</script> 

下面是我使用的模式:

$scripts = preg_split('#(<script>.*?</script>|<script type="text/javascript>.*?</script>")#', $str);  

但我得到這個結果:

Array 
(
    [0] =>  <script> 
     console.log('hello'); 
     console.log('hi!'); 
     console.log('yo!'); 
    </script> 
    <script type="text/javascript"> 
     console.log("this is another inline script"); 
     var hi = "cool"; 
     console.log(hi); 
    </script> 
) 

雖然我期待得到的東西是這樣的:

Array 
(
    [0] =>  <script> 
     console.log('hello'); 
     console.log('hi!'); 
     console.log('yo!'); 
    </script> 
    [1] => 
    <script type="text/javascript"> 
     console.log("this is another inline script"); 
     var hi = "cool"; 
     console.log(hi); 
    </script> 
) 

我使用的模式有什麼問題?提前致謝!

更新

如果我使用s修改我得到的是這樣的:

Array 
(
    [0] => 
    [1] => 
<script type="text/javascript"> 
      console.log("this is another inline script"); 
      var hi = "cool"; 
      console.log(hi); 
</script> 
) 

它管理分離的2個腳本,但第一個腳本成爲一個空字符串

+0

'*''除非使用PCRE_DOTALL'不匹配換行符。 – mario

+0

您好,請查看我的更新。我嘗試過使用's'修飾符,但它看起來並不像它的工作 – user225269

+0

'preg_split'刪除它匹配的部分。請參閱「PREG_SPLIT_DELIM_CAPTURE」的聯機幫助頁 – mario

回答

1

我我只是想做個清單:

  • .與換行符不匹配,除非使用PCRE_DOTALL(/s標誌)。

  • 對於preg_split您還需要PREG_SPLIT_DELIM_CAPTURE選項才能擺脫匹配的零件。

  • 在你的情況下,你最好應該使用preg_match_all而不是preg_split

最後,在你的下一個問題的期待,你的表達不匹配源:

...>|<script type="text/javascript>.*?<.... 
           ^

總之,更好地利用這樣的:

preg_match_all("~(<script[^>]*> (.*?) </script>)~smix", $src, ... 
1

試試這個:

$str=<<<STR 
<script> 
    console.log('hello'); 
    console.log('hi!'); 
    console.log('yo!'); 
</script> 
<script type="text/javascript"> 
    console.log("this is another inline script"); 
    var hi = "cool"; 
    console.log(hi); 
</script> 
STR; 

$split = preg_split('#(?=<script)#', $str,null,PREG_SPLIT_NO_EMPTY); 
var_dump($split); 

我ch anged的正則表達式:

#(?=<script)# 

,結果是:

array(2) { 
    [0]=> 
    string(93) "<script> 
    console.log('hello'); 
    console.log('hi!'); 
    console.log('yo!'); 
</script> 
" 
    [1]=> 
    string(133) "<script type="text/javascript"> 
    console.log("this is another inline script"); 
    var hi = "cool"; 
    console.log(hi); 
</script>" 
}