Regex: Габаритные атрибуты HTML, кроме SRC

Я пытаюсь написать регулярное выражение, которое разделит все атрибуты тегов, кроме атрибута SRC. Например:

This is a paragraph with an image

Будет возвращен как:

 

This is a paragraph with an image

У меня есть регулярное выражение, чтобы удалить все атрибуты, но я пытаюсь настроить его, чтобы оставить его в src. Вот что я до сих пор:

 <?php preg_replace('/]*)>/i', '', ''); 

Используя PHP preg_replace () для этого.

Благодаря! Ян

Это может работать для ваших нужд:

 $text = '

This is a paragraph with an image

'; echo preg_replace("/< ([az][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'< $1$2$3>', $text); //

This is a paragraph with an image

RegExp разбит:

 / # Start Pattern < # Match '<' at beginning of tags ( # Start Capture Group $1 - Tag Name [az] # Match 'a' through 'z' [a-z0-9]* # Match 'a' through 'z' or '0' through '9' zero or more times ) # End Capture Group (?: # Start Non-Capture Group [^>]* # Match anything other than '>', Zero or More Times ( # Start Capture Group $2 - ' src="...."' \s # Match one whitespace src= # Match 'src=' ['"] # Match ' or " [^'"]* # Match anything other than ' or " ['"] # Match ' or " ) # End Capture Group 2 )? # End Non-Capture Group, match group zero or one time [^>]*? # Match anything other than '>', Zero or More times, not-greedy (wont eat the /) (\/?) # Capture Group $3 - '/' if it is there > # Match '>' /i # End Pattern - Case Insensitive 

Добавьте некоторые цитаты и используйте заменяющий текст < $1$2$3> он должен лишить любые свойства src= из хорошо сформированных HTML-тегов.

Обратите внимание: это не обязательно будет работать во всех входах, так как люди Anti-HTML + RegExp так умно замечают ниже. Есть несколько резервных копий, в первую очередь

в конечном итоге

">

и несколько других проблем с ошибкой … Я бы рекомендовал посмотреть Zend_Filter_StripTags как полный фильтр тегов / атрибутов в PHP

Обычно вы не должны анализировать HTML, используя регулярные выражения .

Вместо этого вы должны вызвать DOMDocument::loadHTML .
Затем вы можете пройти через элементы в документе и вызывать removeAttribute .

К сожалению, я не уверен, как ответить на этот вопрос для PHP. Если бы я использовал Perl, я бы сделал следующее:

 use strict; my $data = q^

This is a paragraph with an image

^; $data =~ s{ < ([^/> ]+)([^>]+)> # split into tagtype, attribs }{ my $attribs = $2; my @parts = split( /\s+/, $attribs ); # separate by whitespace @parts = grep { m/^src=/i } @parts; # retain just src tags if ( @parts ) { "< " . join( " ", $1, @parts ) . ">"; } else { "< " . $1 . ">"; } }xseg; print( $data );

который возвращается

 

This is a paragraph with an image

Хорошо, вот что я использовал, что, кажется, хорошо работает:

 < ([AZ][A-Z0-9]*)(\b[^>src]*)(src\=[\'|"|\s]?[^\'][^"][^\s]*[\'|"|\s]?)?(\b[^>]*)> 

Не стесняйтесь совать в нем все отверстия.

Как указано выше, вы должны использовать regex для анализа html или xml.

Я бы сделал ваш пример с str_replace (); если все это время.

 $str = '

This is a paragraph with an image

'; $str = str_replace('id="paragraph" class="green"', "", $str); $str = str_replace('width="50" height="75"',"",$str);

Проводка для предоставления решения для Oracle Regex

 < ([^!][az][a-z0-9]*)([^>]*(\ssrc=[''''\"][^''''\"]*[''''\"]))?[^>]*?(\/?)>