Я пытаюсь написать регулярное выражение, которое разделит все атрибуты тегов, кроме атрибута 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=[''''\"][^''''\"]*[''''\"]))?[^>]*?(\/?)>