Perl Regex для обработки ввода текста - PullRequest
0 голосов
/ 09 февраля 2011

В настоящее время у меня есть Perl-скрипт, который импортирует HTML и преобразует его в обычный текст. Я использую HTML :: TagFilter, чтобы удалить все теги HTML, и он работает почти идеально, за исключением того, что мы столкнулись с одной проблемой. Когда HTML-код содержит нестандартные HTML-теги, такие как «заголовок» в приведенном ниже примере, эти теги не удаляются:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam pulvinar, odio ut gravida fringilla, tellus mi ultrices felis, quis porta lacus sem ut lacus. Vestibulum massa justo, tristique id aliquet in, dapibus eu leo. Nam sapien risus, dictum et porttitor quis, egestas quis dui. Ut nec nisl felis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

[caption id="sample-id" align="sample-align" width="225" caption="Sample Caption"]<a href="http://www.domain.com/image.jpg"><img class="sample-image-class" title="Sample Title" src="http://www.domain.com/image.jpg" alt="Sample Alt" width="225" height="300" /></a>[/caption]

In hac habitasse platea dictumst. Duis imperdiet bibendum dolor ut ullamcorper. Suspendisse dui erat, facilisis sed aliquet non, elementum eu urna. Donec non nisi vel augue gravida imperdiet sed id tortor. Maecenas ullamcorper velit non dui imperdiet hendrerit.

Мне нужна помощь в простом регулярном выражении Perl для полного удаления этого контента. Я пробовал кучу разных подходов, но, похоже, ничего не работает. То, что я ищу, это что-то вроде следующего, что бы найти и удалить все вхождения нестандартных тегов HTML, используя скобки []:

$text =~ s/[(\w)+](.*)[\/(\w)+]//g;

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

Заранее спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

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

$text =~ s/\[\/?\w+(\s+\w+="[^"]*")*\s*\/?\s*\]//g;
0 голосов
/ 09 февраля 2011

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

$text =~ s! #Start match pattern (used exclamation mark instead of / for readability)
        \[ #Left square bracket
          [^\]]*? #Followed by any character(s) which are not ]. ? means lazy match
        \] #Right square bracket
        !!gx; #Replace with nothing, globally, allow comments and whitespace
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...