Я пытаюсь записать регулярное выражение, которое разделит все атрибуты тега за исключением атрибута 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('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i', '<$1>', '<html><goes><here>');
Используя preg_replace PHP () для этого.
Спасибо! Ian
Хорошо, вот то, что я использовал и что, кажется, работает хорошо:
<([A-Z][A-Z0-9]*)(\b[^>src]*)(src\=[\'|"|\s]?[^\'][^"][^\s]*[\'|"|\s]?)?(\b[^>]*)>
Не стесняйтесь указывать на любые дыры в этом.
К сожалению, я не уверен, как ответить на этот вопрос для 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 );
which returns
<p>This is a paragraph with an image <img src="/path/to/image.jpg"></p>
Это может подойти для ваших нужд:
$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("/<([a-z][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
[a-z] # 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 тегов.
Обратите внимание Это не обязательно будет работать на ALL вводе, как умно отмечают ниже люди из Anti-HTML + RegExp. Есть несколько отступлений, в частности, в итоге будет
и несколько других проблем... Я бы рекомендовал обратить внимание на Zend_Filter_StripTags как на полноценный фильтр тегов/атрибутов в PHP
Вы обычно не должны анализировать HTML с помощью регулярных выражений .
Вместо этого вы должны вызвать DOMDocument :: loadHTML
.
Затем вы можете повторно просмотреть элементы в документе и вызвать removeAttribute
.
Как было сказано выше, вы не должны использовать 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);