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('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i', '<$1>', '<html><goes><here>');

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

Спасибо! Ian

11
задан Ian McIntyre Silber 8 June 2010 в 02:33
поделиться

5 ответов

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

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

Не стесняйтесь указывать на любые дыры в этом.

1
ответ дан 3 December 2019 в 03:34
поделиться

К сожалению, я не уверен, как ответить на этот вопрос для 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>
1
ответ дан 3 December 2019 в 03:34
поделиться

Это может подойти для ваших нужд:

$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

.
18
ответ дан 3 December 2019 в 03:34
поделиться

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

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

7
ответ дан 3 December 2019 в 03:34
поделиться

Как было сказано выше, вы не должны использовать 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);
0
ответ дан 3 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: