Как я могу удалить только встроенные изображения с регулярным выражением? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть много пользовательского контента, в котором есть встроенные изображения, в этом стиле:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb2
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1hwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjd7sJAgVGoEgAwXEQA7" 
width="16" height="14" alt="embedded folder icon">

Некоторые изображения в формате gif, некоторые в формате png, но, возможно, они другого типа.Типы изображений тоже.

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

Однако для этого сценария я не мог придумать других инструментов, которые могли бы выполнять эту работу, кроме strip_tags, но я хочу сохранить изображения, которые не закодированы, встроенными.

Итак, как я могу использовать регулярное выражение для фильтрации только встроенных изображений с помощью PHP?Или, если есть лучший инструмент для этого, что это?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Регулярное выражение звучит хорошо для меня.Просто сделайте так, чтобы оно совпадало с data:image/gif и другими типами изображений, которые вы хотите удалить, если и только если они встречаются внутри тега img.

Вот отправная точка, разверните ее по своему вкусу:

<img[^>]* src=['"]?data:image/gif[^>]*>

Обязательно запустите его с флагом игнорирования регистра и проверьте его до того, как запустить его.

1 голос
/ 09 декабря 2011

Регулярные выражения вообще не осуждаются.Они инструмент, как и любой другой в наборе инструментов PHP.Проблемы начинают появляться, когда вы используете регулярные выражения для анализа HTML.Для небольших фрагментов «известного формата» вы можете сойти с рук.Но как обычный инструмент для манипулирования HTML, регулярные выражения просто НЕ МОГУТ гарантировать, что вы получите хорошие результаты, поскольку HTML не является обычным языком.

Как и в большинстве HTML-манипуляций, используйте DOM:

$dom = new DOMDocument;
$dom->loadHTML(...);
$xp = new DOMXPath($dom);

$images = $xp->query("//img[starts-with(@src,'data:image']");

foreach($images as $img) {
    $img->parentNode->removeChild($img);
}
...