2015-06-02 2 views
1

У меня есть жало, которая является HTML, и я хочу удалить определенные разделы этого сервера с помощью PHP (без использования JavaScript/jQuery-решений). Строка должна иметь определенные идентификаторы в ней для тегов разделов, которые могут быть удалены, и я также буду иметь некоторую переменную, которая указывает, какие отмеченные разделы должны быть удалены. Эти метки индикаторов не должны оставаться в окончательной модифицированной строке.Удаление разделов HTML-строки с использованием PHP

Например, рассмотрите $html_1, где я включил атрибут capture, чтобы пометить разделы, которые могут быть удалены. Или $html_2, где я обернул [capture] вокруг тегов, которые могут быть удалены. Обратите внимание, что это были всего лишь два возможных способа, по которым я думал о пометке разделов, и все в порядке с любым другим методом, который позволяет хранить строку в БД.

Для обоих, у меня есть <h2> блок, <h1> блок, и блок, в котором <p>capture используется для обозначения участков, которые могут или не могут быть удалены. Затем дано $modify, которое указывает, какие разделы следует удалить или не следует удалять, как я могу сгенерировать новую строку, которая равна $html_new? Я думаю, может быть, DOMDocument, str_replace или решение для регулярных выражений может работать, но не уверен.

<?php 

$html_1 = <<<EOT 
<div> 
    <div> 
     <div> 
      <h1 capture="a">bla bla bla</h1> 
      <p>bla</p> 
      <h2 capture="b">bla bla<span>bla</span></h2> 
      <h1>bla bla bla bla</h1> 
     </div> 
    </div> 
    <div> 
     <p capture="c">bla bla bla</p> 
     <h1>bla bla</h1> 
    </div> 
</div> 
EOT; 

$html_2 = <<<EOT 
<div> 
    <div> 
     <div> 
      [caption id="a"]<h1>bla bla bla</h1>[/caption] 
      <p>bla</p> 
      [caption id="b"]<h2>bla bla<span>bla</span></h2>[/caption] 
      <h1>bla bla bla bla</h1> 
     </div> 
    </div> 
    <div> 
     [caption id="c"]<p>bla bla bla</p>[/caption] 
     <h1>bla bla</h1> 
    </div> 
</div> 
EOT; 

$modify=array('a'=>true,'b'=>false,'c'=>true); 

$html_new = <<<EOT 
<div> 
    <div> 
     <div> 
      <p>bla</p> 
      <h2>bla bla</h2> 
      <h1>bla bla bla bla</h1> 
     </div> 
    </div> 
    <div> 
     <h1>bla bla</h1> 
    </div> 
</div> 
EOT; 
?> 
+0

Вы пробовали что-нибудь самостоятельно? Похож на довольно простой шаблон регулярного выражения. – treegarden

+0

@treegarden Я довольно слабый с регулярным выражением. Моя трудность будет различать теги 'a',' b' и 'c'. Вероятно, я собирался спуститься по решению «DOMdocument», но, возможно, это не правильный путь. – user1032531

+0

HTML с регулярным выражением? См. [Здесь] (http://stackoverflow.com/a/1732454/1864610). DOMdocument - это именно то, что нужно. –

ответ

1

Я использовал $html_2, потому что мне стало легче. Это должно сделать трюк:

foreach($modify as $letter=>$remove) { 
    $pattern = '/\[caption id="' . $letter . '"\](.*)\[\/caption\]/U'; 
    $replace = ($remove) ? '' : '$1'; 
    $html_2 = preg_replace($pattern, $replace, $html_2); 
} 
$html_2 = preg_replace('/^\h*\v+/m', '', $html_2); // Optional: Removing empty lines 

В случае $remove ложно для определенной буквы, то искомая часть строки прибудет Сменился с первой группой захвата (который все окружен тегами захвата). Если это правда, оно заменяется пустой строкой.

+0

Учитывая очень уникальный разделитель '[caption ...', я бы ожидал, что это не повредит HTML. Согласен? – user1032531

+0

Ну, все теги '[caption ...]' будут удалены на стороне сервера, прежде чем он будет отправлен клиенту, а HTML будет отображаться, поэтому вам не нужно беспокоиться об этом :) – treegarden

+0

И нет, учитывая вам также не нужно беспокоиться о том, что regex испортил что-нибудь еще. – treegarden

0

Вы можете использовать preg_replace заменить любую строку, содержащую захват = «а» с пустой строкой, как это:

$stripped = preg_replace(/^.*(capture="a").*$/, '', $html_1); 

Если заключенным это в функции, вы можете передать аргумент раздеть , b или c:

function strip($capture,$block){ 
    $stripped = preg_replace(/^.*(capture="'.$capture.'").*$/, '', $block); 
    return $stripped; 
} 
Смежные вопросы