Regex: удалить атрибуты HTML, кроме SRC - PullRequest
11 голосов
/ 08 июня 2010

Я пытаюсь написать регулярное выражение, которое удалит все атрибуты тега, кроме атрибута 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>');

Использование для этого PHP preg_replace ().

Спасибо!Ian

Ответы [ 6 ]

17 голосов
/ 09 июня 2010

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

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

7 голосов
/ 08 июня 2010

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

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

1 голос
/ 09 июня 2010

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

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

Не стесняйтесь тыкать в нее.

1 голос
/ 08 июня 2010

К сожалению, я не уверен, как ответить на этот вопрос для 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>
0 голосов
/ 17 июня 2015

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

<([^!][a-z][a-z0-9]*)([^>]*(\ssrc=[''''\"][^''''\"]*[''''\"]))?[^>]*?(\/?)>
0 голосов
/ 09 июня 2010

Как уже было сказано выше, вы не должны использовать регулярные выражения для разбора 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...