2016-09-29 3 views
2

у меня есть этот пример кода:PHP - с помощью strip_tags УДАЛИТЬ текст между удаленными тегами

<?php 

$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.'; 

echo strip_tags($string); 
?> 

Результат этого кода:

Left text from tag What is going on here? Calm up right now. Right text. Possible another tag.. but not always. 

Однако моя цель состоит в том, чтобы удалить все текст (включая теги) между тегами, удаленными этой функцией strip_tags. То есть. результат должен быть:

Left text from tag Right text. Possible another but not always. 

Я знаю, что это может быть сделано с preg_replace, но это слишком медленно, так, может быть, есть более быстрый решение .. (не обязательно связан с функцией strip_tags).

ответ

1

Использование REGEX - лучшее и самое компактное решение, на мой взгляд. Попробуйте это:

echo preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $string); 

Если вы не хотите использовать preg_replace, использовать индивидуальные функции strip_tags_content(), упомянутые в данном руководстве.

function strip_tags_content($text, $tags = '', $invert = FALSE) { 

    preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags); 
    $tags = array_unique($tags[1]); 

    if(is_array($tags) AND count($tags) > 0) { 
     if($invert == FALSE) { 
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text); 
     } else { 
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text); 
     } 
    } elseif($invert == FALSE) { 
      return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text); 
    } 
    return $text; 
} 

echo strip_tags_content($string); 

Примечание: Я не думаю, что желаемый результат может быть достигнут с использованием только функций PHP. Вы должны использовать REGEX так или иначе.

+0

Да, но это может быть сделано без использования preg_replace (т. Е мне нужно более быстрое решение ..). Так как strip_tags знает, что заменить, возможно, он может быть использован для удаления текста между тем, что обнаружено в strip_tags .. – Tom

+0

Не думаю, что вы можете найти прямое решение вашей проблемы, используя PHP в встроенных функциях. Вы должны использовать REGEX так или иначе. –

1

Как насчет подхода DOMDocument?

<?php 

$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.'; 

$dom = new DomDocument(); 
$dom->loadHTML('<body>' . $string . '</body>'); 

$stripped = ''; 
$els = $dom->getElementsByTagName('body')->item(0)->childNodes; 
$len = count($els) - 1; 
foreach($els as $index => $child) { 
    if (is_null($child->tagName)) 
     $stripped .= ' ' . trim($child->nodeValue); 
} 
$stripped = substr($stripped, 1); 

echo $stripped; 

Output:

Left text from tag Right text. Possible another but not always. 
+0

Это тоже может работать (хотя теперь я задаюсь вопросом, что быстрее, preg_replace или это решение :) – Tom

+0

Я не знаю о скорости, но то, что вы получаете, является читабельностью. –

+0

Правильно, даже я это понимаю, не разбирая мозг, спасибо .. – Tom

Смежные вопросы