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

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

<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p> 

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

 <p>This is a paragraph with an image <img src="/path/to/image.jpg" /></p> 

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

 <?php preg_replace('/<([AZ][A-Z0-9]*)(\b[^>]*)>/i', '<$1>', '<html><goes><here>'); 

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

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

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

 $text = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; echo preg_replace("/<([az][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>', $text); // <p>This is a paragraph with an image <img src="/path/to/image.jpg"/></p> 

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 так умно замечают ниже. Есть несколько резервных копий, в первую очередь <p style=">"> в конечном итоге <p>"> и несколько других проблем с ошибкой … Я бы рекомендовал посмотреть Zend_Filter_StripTags как полный фильтр тегов / атрибутов в PHP

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

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

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

 use strict; my $data = q^<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>^; $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 ); 

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

 <p>This is a paragraph with an image <img src="/path/to/image.jpg"></p> 

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

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

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

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

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

 $str = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; $str = str_replace('id="paragraph" class="green"', "", $str); $str = str_replace('width="50" height="75"',"",$str); 

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

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