2017-05-03 1 views
0

Mit PHP, in HTML-Datei, möchte ich die CDATA Blöcke in einem Skriptelement entfernen.Wie CDATA-Blöcke in einem Skriptelement zu entfernen?

<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var A=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var B=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
some text5 ........................ 

Ich habe nicht gefunden, wie & entfernen diese mit XPath-Knoten wählen & PHP DomDocument.

Ich habe versucht, mit diesem regulären Ausdruck $re = '/\/\*\s*<!\[CDATA\[[\s\S]*\/\*\s*\]\]>\s*\*\//i';

Aber diese entfernt alle Text einschließlich der zwischen zwei Blöcken von CDATA.

Als Ergebnis erhalte ich eine leere Zeichenfolge statt

some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
some text5 ........................ 

Irgendwelche Ideen?

Aktualisierung mit ThW Lösung:

Mit dieser Seite, so scheint es, dass der Text des Abschnitts CDATA ist nicht gut analysiert

libxml_use_internal_errors(true); 
$domDoc = new DOMDocument(); 
$domDoc->loadHTMLFile('https://www.maisons-qualite.com/le-reseau-mdq/recherche-constructeurs-agrees/construction-maison-neuve-centre-val-loire'); 
libxml_clear_errors(); 

$xpath = new DOMXpath($domDoc); 
foreach($xpath->evaluate('//text()') as $section) { 
    if ($section instanceof DOMCDATASection) { 
    print_r($section->textContent); 
    $section->parentNode->removeChild($section); 
    } 
} 
$content = $domDoc->saveHTML(); 

Ich habe diese textcontent

..... 
..... 
function updateConstructeurs(list) { 
    for (var i in list) { 
     if(list[i]['thumbnail']) { 
      jQuery('#reseau-constructeurs').append('<div class="reseau-constructeur">' + 
       '<div class="img" style="background-image:url(' + list[i]['thumbnail'] + ')"> 

für

function updateConstructeurs(list) { 
    for (var i in list) { 
     if(list[i]['thumbnail']) { 
      jQuery('#reseau-constructeurs').append('<div class="reseau-constructeur">' + 
       '<div class="img" style="background-image:url(' + list[i]['thumbnail'] + ')"></div>' + 
       '<h3>' + list[i]['title'] + '</h3>' + 
       '<a class="btn purple" href="' + list[i]['link'] + '">Accéder à la fiche</a>' + 
      '</div>'); 
     } 
    } 
} 

Und als Ergebnis, statt eine leere Zeichenfolge bekommen, haben wir:

     '<h3>' + list[i]['title'] + '</h3>' + 
         '<a class="btn purple" href="'%20+%20list%5Bi%5D%5B'link'%5D%20+%20'">Acc&eacute;der &agrave; la fiche</a>' + 
        '</div>'); 
       } 
      } 
     } 
    /* ]]&gt; */ 

Antwort

1

die [\s\S]* nicht gierige Stellen, dh [\s\S]*?:

\/\*\s*<!\[CDATA\[[\s\S]*?\/\*\s*\]\]>\s*\*\/ 

Demo: https://regex101.com/r/AutLW9/1

+0

Scheint nicht zu arbeiten. Anzeige "Verarbeitung ..." ohne Ergebnis – LeMoussel

+0

Hm, ich bin mir nicht sicher warum. Versuchen Sie diesen Link: https://regex101.com/r/ZiH3zj/1 –

+0

Gleicher Fehler, aber es ist OK in PHP. Ich poste Ihre Lösung in PHP. – LeMoussel

0

Dmitry Egorov Lösung in PHP.

$re = '/\/\*\s*<!\[CDATA\[[\s\S]*?\/\*\s*\]\]>\s*\*\//'; 
$str = '<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var A=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var B=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text5 ........................'; 
$subst = ''; 

$result = preg_replace($re, $subst, $str); 

echo "The result of the substitution is ".$result; 
0

CData-Abschnitte sind eine Art von Zeichenknoten, wie Textknoten. Für den meisten Zweck behandeln Sie sie auf die gleiche Weise - der Unterschied liegt in der Serialisierung. So holen Sie die Knoten mit XPath und entfernen Sie sie, wenn sie CDATA-Abschnitte sind (und nicht die Textknoten):

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('//text()') as $section) { 
    if ($section instanceof DOMCDATASection) { 
    $section->parentNode->removeChild($section); 
    } 
} 

echo $document->saveHtml(); 

immer Sie wollen vielleicht, dass zu überdenken. Es ist wirklich wichtig, keine CDATA-Abschnitte zu haben? Möglicherweise möchten Sie den Inhalt von script Elemente entfernen. Dies ist sogar noch kürzer:

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('//script/node()') as $node) { 
    $node->parentNode->removeChild($section); 
} 

echo $document->saveHtml(); 

//script/node() paßt zu jedem Kind-Knoten in einem script Elemente. Sei es ein CDATA-Bereich, ein Textknoten oder irgendetwas anderes.

+0

Goog Lösung ohne Verwendung von RegExp. Aber ich habe einen Fehler. Ich aktualisiere meinen Beitrag damit. – LeMoussel

Verwandte Themen