Я должен удалить все содержимое (и теги) между тегами в строке PHP, полученной из файла_файла_определения общего URL-адреса веб-сайта. Я использую выражение RegEx:PHP - удалить все содержимое внутри <script> и CDATA строки HTML
preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $string);
Он отлично работает, но моя проблема заключается в том, что, если сценарий содержит тег CDATA, он не будет работать. Пример строки будет:
<script type='text/javascript'>
/* <![CDATA[ */
var variable = {"ajax":"....."}
/* ]]> */
</script>
Я думаю, что проблема с теми «/ » и « /» тегов.
Я уже искал в гугле и на переполнение стека, но Ther не вопрос с конкретным типом CDATA тега (с/* и * /), так что ничего не работает.
Любое предложение?
Edit: Как Стив ответил, я теперь с помощью кода, как это:
foreach($dom->getElementsByTagName('script') as $scripttag){
$scripttag->parentNode->removeChild($scripttag);
}
И тогда у меня есть:
foreach($dom->getElementsByTagName('ins') as $string) {
$string2 .= $string->nodeValue;
$string2 .= ' ';
}
Но что возвращает $ string2 с сценарий теги внутри ,
EDIT 2 (решаемая): С помощью Стива, я обнаружил, что с помощью Xpath решает эту проблему:
$xpath = new DOMXpath($dom);
foreach ($xpath->query('//script') as $node) {
$node->parentNode->removeChild($node);
}
, который удаляет теги сценария и внутри другого тега, например:
<ins><script>First JS</script></ins>
<ins>Hello</ins>
<script>Second JS</script>
Выведет
Hello
Спасибо всем за помощь!
регулярное выражение для HTML разбора не является хорошей идеей. И не забывайте снимать
–
В чем проблема? Я вижу, что он работает [«красиво»] (https://regex101.com/r/kS2oB7/1) (конечно, только с предоставленным примером). –
@stribizhev, который является проблемой разбора html с регулярным выражением, так как с точки зрения злоумышленника я не соблюдаю правила .... https://regex101.com/r/zV1yA2/1 – ins0