2016-09-23 3 views
0

Ich habe folgendes Script, dasentfernen mehrzeilige Script regulären Ausdruck

mehrere Vorkommen in einem Beitrag hat
<script type='text/javascript'> 
    if(typeof(jQuery)=="function"){(function($){$.fn.fitVids=function(){}})(jQuery)}; 
    customfunction('customfunction_div').setup(
    {"playlist":"customfunction\/jw6\/eM0MzdZ2.xml"} 
); 
</script> 

Ich mag Vorkommen dieser Skripte in preg_replace oder preg_replace_callback mit regulärem Ausdruck entfernen, auch wenn möglich überprüfen will, wenn customfunction_div existiert mindestens einmal im Skript. Bitte helfen!

+0

Versuchen Sie https://ideone.com/84eH8f, siehe [die Regex-Demo] (https://regex101.com/r/dS1xR7/2) –

Antwort

0

Sie sollten HTML mit den richtigen Tools wie DOMDocument analysieren, statt sich auf reguläre Ausdrücke zu verlassen.

Hier ein Ausschnitt zeigt, wie die script Tags customfunction_div innen, die das Wort zu ergreifen, und entfernen Sie sie:

$html = "<html><head><script type='text/javascript'>\n if(typeof(jQuery)==\"function\"){(function(\$){\$.fn.fitVids=function(){}})(jQuery)};\n customfunction('cu').setup(\n {\"playlist\":\"customfunction\/jw6\/eM0MzdZ2.xml\"}\n);\n</script>\n\n<script type='text/javascript'>\n if(typeof(jQuery)==\"function\"){(function(\$){\$.fn.fitVids=function(){}})(jQuery)};\n customfunction('customfunction_div').setup(\n {\"playlist\":\"customfunction\/jw6\/eM0MzdZ2.xml\"}\n);\n</script></head><body>TEXT</body></html>"; 
$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 
$xp = new DOMXPath($dom); 
$scripts = $xp->query('//script[contains(.,"customfunction_div")]'); 
foreach ($scripts as $script) { 
     $script->parentNode->removeChild($script); 
} 
echo $dom->saveHTML(); 

Siehe PHP demo

Hier ist //script[contains(.,"customfunction_div")] ein XPath-Ausdruck, der die script Tags packt mit Inhalt (.) mit customfunction_div.

Wenn Sie auf einem regulären Ausdruck bestehen, das '~<script\b(?:(?!</?script[\s>]).)*customfunction_div.*?</script>~s' Muster sollte in den meisten Fällen für Sie arbeiten (wie es jede <script offenen Tag entsprechen wird, werden alle Sequenzen, die nicht mit <script oder </script beginnen (siehe (?:(?!</?script[\s>]).)*) und dann erforderlichen Wert und dann 0+ Zeichen bis zum ersten </script>), aber denken Sie daran, dass Regex nicht das richtige Werkzeug ist, um HTML zu manipulieren. Verwenden Sie es nur als Ausweichlösung, wenn Sie beschädigtes HTML erhalten.