2013-05-28 4 views
0

Я пытаюсь удалить следующий шаблон из строки:PHP preg_replace()

<div class="main_title">Content 1</div> 

где 'Содержание 1' может варьироваться между строками.

Следующая, кажется, не работает:

$output = preg_replace('<div class="main_title">.*</div>', " ", $output); 

Я пропускаю что-то очевидное?

+2

'Я пропущу что-то очевидное?' Вы пытаетесь разобрать HTML с регулярными выражениями. –

+2

Не разбирайте HTML с регулярным выражением! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

См. [эти] (http://stackoverflow.com/questions/3577641/how-to -parse-and-process-html-xml/3577662 # 3577662) [ответы] (http://stackoverflow.com/questions/3820666/grabbing-the-href-attribute-of-an-a-element/3820783#3820783) для [лучшего способа] (http://stackoverflow.com/questions/4979836/noob-question-about-domdocument-in-php/4983721#4983721). –

ответ

1

Как говорится в комментариях, не используйте регулярные выражения для анализа HTML, вместо этого используйте SimpleXML или DOMDocument. Если вам нужно регулярное выражение, тем не менее, вы должны поместить выкройки разделители в вашем коде:

$output = preg_replace('#<div class="main_title">.*</div>#', " ", $output); 
3

Метод DOM, вероятно, выше, потому что вам не придется беспокоиться о том случае чувствительной, пробел и т.д.

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//div[@class="main_title"]') as $node) { 
    $node->parentNode->removeChild($node); 
} 
$output = $dom->saveHTML(); 

Это можно сделать с регулярным выражением, особенно если вы можете доверять тому, что ваш ввод будет следовать очень конкретному формату (без лишних пробелов, возможно, несоблюдения расхождений и т. Д.). Основная проблема заключается в отсутствии ограничителей PCRE.

$output = preg_replace('@<div class="main_title">.*?</div>@', '', $output);