Regex для удаления условных комментариев

Когда я был в другом офисе, и в этом проекте у меня была похожая проблема, все функции выравнивания в библиотеке не работали. Но у меня есть хитрое решение сделать так, чтобы изображение логотипа стало центром. Я рисую растровое изображение с белым или прозрачным разрешением и помещаю положение ширины прямо в середине квитанции.

public Bitmap createBitmap(Rect rectImage, int i, int j) {

        Paint p = new Paint();
        p.setStyle(Style.FILL_AND_STROKE);
        p.setAntiAlias(true);
        p.setFilterBitmap(true);
        p.setDither(true);
        p.setColor(Color.WHITE);

        Bitmap bitmap = Bitmap.createBitmap(rectImage.width() * 2,
                rectImage.height() * 2, Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(bitmap);
//      c.drawColor(Color.RED);
        c.drawRect(rectImage.left, rectImage.top, rectImage.right,
                rectImage.bottom, p);
        return bitmap;

    }

Затем объединяю это растровое изображение с вашим логотипом. , пожалуйста, используйте код, подобный этому (не этот код)

public static Bitmap mergeToPin(Bitmap left, Bitmap right) {
    Bitmap result = Bitmap.createBitmap(left.getWidth(), left.getHeight(), left.getConfig());
    Canvas canvas = new Canvas(result);
    int widthleft = left.getWidth();
    int widthright = right.getWidth();
    canvas.drawBitmap(left, 0f, 0f, null);
    canvas.drawBitmap(right, widthleft, 0f, null);
    return result;
}

Как вы знаете, размер квитанции можно предсказать. Таким образом, вы можете сделать статическое значение для ширины прозрачного изображения

5
задан cnu 25 September 2008 в 10:55
поделиться

7 ответов

>>> from BeautifulSoup import BeautifulSoup, Comment
>>> html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
>>> soup = BeautifulSoup(html)
>>> comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
               and text.find('if') != -1) #This is one line, of course
>>> [comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
>>> print soup.prettify()
<html>
</html>
>>>     

python 3 с bf4:

from bs4 import BeautifulSoup, Comment
html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
soup = BeautifulSoup(html, "html.parser")
comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
               and text.find('if') != -1) #This is one line, of course
[comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
print (soup.prettify())

Если Ваши данные перепутали BeautifulSoup, можно зафиксировать его перед рукой или настроить синтаксический анализатор среди других решений.

Править: На Ваш комментарий Вы просто изменяете лямбду, переданную findAll, поскольку Вам нужно (я изменил его),

5
ответ дан 13 December 2019 в 19:39
поделиться

Поскольку я вижу его, только необходимо волноваться о скрытых от низкого уровня комментариях (те, которые запускаются с <!--), и Вы ничему не должны соответствовать вне слова if и пространство после него. Это должно сделать то, что Вы хотите:

"<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->"

Та путаница в середине состоит в том, чтобы удовлетворить Ваше требование не использовать .*?, но я действительно не думаю, что это стоит усилия. .*? подход должен хорошо работать при компиляции regex с Ре. Набор флага S или переносит его в (?s:...). Например:

"(?s:<!--\[if\s.*?<!\[endif\]-->)"
2
ответ дан 13 December 2019 в 19:39
поделиться

Вот то, в чем Вы будете нуждаться:

<!(|--)\[[^\]]+\]>.+?<!\[endif\](|--)>

Это отфильтрует все виды условных комментариев включая:

<!--[if anything]>
    ...
<[endif]-->

и

<![if ! IE 6]>
    ...
<![endif]>

EDIT3: работы решения Vinko Vrsalovic, но фактическая проблема, почему отказавший beautifulsoup был из-за комментария жулика в рамках условного комментария. Как

Заметить комментарий?

Хотя моя проблема была, решают, я хотел бы получить regex решение для этого.

Как насчет этого:

(<!(|--)\[[^\]]+\]>.*?)(<!--.+?-->)(.*?<!\[endif\](|--)>)

Сделайте замену на том регулярном выражении, уехав \1\4 (или $1$ 4) как замена.
Я знаю, что это имеет.*? и. +? в нем см. мой комментарий к этому сообщению.

2
ответ дан 13 December 2019 в 19:39
поделиться

@Benoit

Маленькое Исправление (с включенной мультилинией):

 "<!--\[if IE\]>.*?<!\[endif\]-->"
1
ответ дан 13 December 2019 в 19:39
поделиться

Я просто пошел бы с:

import re

html = """fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs---><!--[if lt IE 7.]>\
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE-->\
<![endif]-->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->"""

# here the black magic occurs (whithout '.')
clean_html = ''.join(re.split(r'<!--\[[^¤]+?endif]-->', html))

print clean_html

'fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->'

N.B: [¤ ^] будет соответствовать любому символу, который не является '¤'. Это действительно полезно, так как это - молния быстро, и этот символ может быть найден на любой клавиатуре. Но прием, действительно трудно ввести (никто не введет его по ошибке), и никто не использует его: это - generical денежный символ завещания.

Если Вы не испытываете желание использовать ¤, однако, можно использовать chr (7) для генерации "системного символа" звонка, который является непечатным и не может быть найден в веб-странице ;-)

1
ответ дан 13 December 2019 в 19:39
поделиться

Не используйте регулярное выражение для этого. Вы запутаетесь о комментариях, содержащих открывающие тэги и что не, и делают неправильную вещь. HTML не является регулярным, и пытающийся изменить это с единственным регулярным выражением перестанет работать.

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

0
ответ дан 13 December 2019 в 19:39
поделиться

Это работает в Visual Studio 2005, где нет никакой опции промежутка строки:

\<!--\[if IE\]\>{.|\n}*\<!\[endif\]--\>

0
ответ дан 13 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: