Я пытаюсь использовать регулярные выражения для удаления определенных блоков кодирования из текстового файла.До сих пор большинство моих строк регулярного выражения работали над удалением кодов.Однако у меня есть два вопроса:
1) Всякий раз, когда я удаляю кусок текста, где текст должен был быть, заменяется пустым пространством, а не просто удаляется.Пример моего кода регулярного выражения:
$file =~ s/<ul(.*)>//gi;
, который удаляет все строки в базовом формате <ul...>
, что я и хочу.Однако, как упоминалось ранее, он заменяет тег и все содержащиеся в нем данные пробелами, и мне было интересно, как остановить эту конкретную подстановку.
2) Некоторые коды регулярных выражений, которые должны работать, похоже, не работают,Например, я хочу удалить
<script type="text/javascript">
function getCookies() { return ""; }
</script>
Я пытался использовать различные коды регулярных выражений, но, похоже, ничего не удаляет эти строки.Например:
$file =~ s/<script type(.*)<\/script>//gi;
, который удаляет теги <script type...>
и </script>
соответственно, но оставляет
function getCookies() { return ""; }
... без изменений.Я не уверен, почему это происходит, и я очень хотел бы исправить это.Как это было бы возможно?Любая помощь по любому из этих двух вопросов была бы чрезвычайно полезной!
Редактировать: Извините, я использую Perl!Кроме того: я только что попытался использовать
$file =~ /<script type(.*)<\/script>/sgi
..., а также / msgi
, но, к сожалению, ни один из них не сработал.Теги <script type>
и </script>
были удалены, но по какой-то причине секция
function getCookies() { return ""; }
... осталась.Вот весь мой код, включая все регулярные выражения:
use strict;
use warnings;
my $firstarg;
if ($ARGV[0]){
$firstarg = $ARGV[0];
}
open (DATA, $ARGV[1]);
my $file = do {local $/; <DATA>};
$file =~ s/<\!DOCTYPE(.*)>//gi;
$file =~ s/<html>//gi;
$file =~ s/<\/html>//gi;
$file =~ s/<title>//gi;
$file =~ s/<\/title>//gi;
$file =~ s/<head>//gi;
$file =~ s/<\/head>//gi;
$file =~ s/<link(.*)>//gi;
$file =~ s/<\link>//gi;
$file =~ s/CDM(.*)\;//gi;
$file =~ s/<\!(.*)->//gi;
$file =~ s/<body(.*)>//gi;
$file =~ s/<\/body>//gi;
$file =~ s/<div(.*)>//gi;
$file =~ s/<\/div>//gi;
$file =~ s/function(.*)>//gi;
$file =~ s/<noscript>//gi;
$file =~ s/<\/noscript>//gi;
$file =~ s/<a(.*)>//gi;
$file =~ s/<\/a>//gi;
$file =~ s/<ul(.*)>//gi;
$file =~ s/<\/ul>//gi;
$file =~ s/<li(.*)>//gi;
$file =~ s/<\/li>//gi;
$file =~ s/<form(.*)>//gi;
$file =~ s/<\/form>//gi;
$file =~ s/<iframe(.*)>//gi;
$file =~ s/<\/iframe>//gi;
$file =~ s/<select(.*)>//gi;
$file =~ s/<\/select>//gi;
$file =~ s/<textarea(.*)>//gi;
$file =~ s/<\/textarea>//gi;
$file =~ s/<b>//gi;
$file =~ s/<\/b>//gi;
$file =~ s/<H1>//gi;
$file =~ s/<H2>//gi;
$file =~ s/<H3>//gi;
$file =~ s/<H4>//gi;
$file =~ s/<H5>//gi;
$file =~ s/<H6>//gi;
$file =~ s/<\/H1>//gi;
$file =~ s/<\/H2>//gi;
$file =~ s/<\/H3>//gi;
$file =~ s/<\/H4>//gi;
$file =~ s/<\/H5>//gi;
$file =~ s/<\/H6>//gi;
$file =~ s/<option(.*)>//gi;
$file =~ s/<\/option>//gi;
$file =~ s/<p>//gi;
$file =~ s/<\/p>//gi;
$file =~ s/<span(.*)>//gi;
$file =~ s/<\/span>//gi;
$file =~ s/<!doctype(.*)>//gi;
$file =~ s/<base(.*)>//gi;
$file =~ s/<br>//gi;
$file =~ s/<hr>//gi;
$file =~ s/<img(.*)>//gi;
$file =~ s/<input(.*)>//gi;
$file =~ s/<link(.*)>//gi;
$file =~ s/<meta(.*)>//gi;
$file =~ s/<script type(.*)<\/script>//gi;
print $file;
Хорошо, теперь, когда я удалил регулярное выражение <script>
, которое вызывало одну проблему, была создана другая - с помощью:
$file =~ s/<script type(.*)<\/script>//gi;
удаляет все, что находится между первым экземпляром <script ...>
, но не сам тег, не повторения тега во всем.Использование:
$file =~ s/<script type(.*)<\/script>//mgi;
приводит к точно так же.Использование:
$file =~ s/<script type(.*)<\/script>//sgi;
приводит к печати нескольких символов новой строки, но без другого текста, то же самое для /msgi
.Ух, проблемы никогда не заканчиваются ...: (*
NEW EDIT: Я хотел бы извиниться за публикацию вопроса о разборе HTML с помощью регулярных выражений. Я понимаю, что в сообществе программистов есть довольно большая обратная реакцияпопрактиковаться (или попытаться попрактиковаться, так как это, похоже, чаще всего дает сбой, чем нет). Однако я, к сожалению, вынужден использовать регулярные выражения для разбора selected HTML, которые можно будет удалить, если большинствоне все теги HTML. Мне не разрешено использовать модуль, несмотря на то, что это самый очевидный и самый простой из ответов.