Регулярно удаляйте теги div, но не их содержимое. - PullRequest
1 голос
/ 12 августа 2010

Допустим, это мой HTML:

<ul>
    <li><div style="width: 10em;">Hello</div><div class="ble"></div></li>
</ul>

Я хочу получить это:

<ul>
    <li>Hello</li>
</ul>

Как видите, все открывающие и закрывающие теги div были удалены, но не их содержимое!

Это то, что я имею до сих пор:

$patterns = array();
$patterns[0] = '/<div.*>/';
$patterns[1] = '/</div>/';
$replacements = array();
$replacements[2] = '';
$replacements[1] = '';
echo preg_replace($patterns, $replacements, $html);

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

заменить '/<div.*>/' на '/<div.*?>/' Это удалит жадное поведение * и совпадет с первым >, с которым встречаются.

Кроме того, вам необходимо избежать обратной косой черты в шаблоне для соответствия закрывающему тегу - используйте:

'/<\/div>/';
1 голос
/ 12 августа 2010

Я бы начал с замены <div[^>]*> и </div[^>]*> ничем. Хотя я немного знаю о конкретном PHP-движке регулярных выражений, следующее sed работало нормально:

pax> cat qq.in
<ul>
    <li><div style="width: 10em;">Hello</div><div class="ble"></div></li>
</ul>

pax> cat qq.in | sed -e 's/<div[^>]*>//g' -e 's/<\/div>//g'
<ul>
    <li>Hello</li>
</ul>

На самом деле вы можете объединить это в одно регулярное выражение </?div[^>]*>:

pax> cat qq.in | sed -r -e 's_</?div[^>]*>__g'
<ul>
    <li>Hello</li>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...