RegEx для замены и добавления атрибутов в тег HTML - PullRequest
1 голос
/ 27 марта 2009

С учетом следующего кода:

<body>
  <img src="source.jpg" />
  <p>
    <img src="source.jpg" id ="hello" alt="nothing" />
    <img src="source.jpg" id ="world"/>
  </p>
</body>

Какой самый лучший способ - использовать регулярное выражение (или лучше?) - заменить его так, чтобы оно стало таким:

<body>
  <img src="source.jpg" id="img_0" />
  <p>
    <img src="source.jpg" id ="img_1"  alt="nothing" />
    <img src="source.jpg" id ="img_2"/>
  </p>
</body>

Другими словами:

  • Все теги <image /> заполняются атрибутом id.

  • Атрибут id должен содержать инкрементный атрибут (хотя на самом деле это не проблема, поскольку он является просто частью процедуры замены)

Полагаю, нужно два прохода: один для удаления всех существующих атрибутов id, а другой для заполнения новыми?

Ответы [ 3 ]

5 голосов
/ 28 марта 2009
<?php
$data = <<<DATA
<body>
  <img src="source.jpg" />
  <p>
    <img src="source.jpg" id ="hello" alt="nothing" />
    <img src="source.jpg" id ="world"/>
  </p>
</body>
DATA;

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->strictErrorChecking = true;
$doc->standalone = true;
$doc->xmlStandalone = true;
$doc->formatOutput = true;
$doc->loadXML($data, LIBXML_NOWARNING | LIBXML_NOERROR);

$sNode = $doc->getElementsByTagName("img");

$id = 0;
foreach($sNode as $searchNode)
{
  $searchNode->setAttribute('id', "img_$id");
  $doc->importNode($searchNode);
  $id++;
}

$result = $doc->saveHTML();
echo $result;
2 голосов
/ 27 марта 2009

Я думаю, что лучше всего использовать preg_replace_callback.

Также я бы порекомендовал немного более строгий regexp, чем те, которые предлагались до сих пор - что если ваша страница содержит тег <img />, который не содержит атрибут id?

$page = '
<body>
  <img src="source.jpg" />
  <p>
    <img src="source.jpg" id ="hello" alt="nothing" />
    <img src="source.jpg" id ="world"/>
  </p>
</body>';

function my_callback($matches)
{
    static $i = 0;
    return $matches[1]."img_".$i++;
}

print preg_replace_callback('/(<img[^>]*id\s*=\s*")([^"]*)/', "my_callback", $page);

Что производит для меня следующее:

<body>
  <img src="source.jpg" />
  <p>
    <img src="source.jpg" id ="img_0" alt="nothing" />
    <img src="source.jpg" id ="img_1"/>
  </p>
</body>

У regexp есть две группы захвата: первую мы сохраняем, а другую заменяем. Я использовал множество классов отрицательных символов (например, [^>]* = до закрытия >), чтобы убедиться, что <img /> теги не требуют , чтобы иметь id атрибуты.

1 голос
/ 27 марта 2009

С соответствующим экранированием (которое я никогда не смогу запомнить без проб и ошибок) и чем-то, увеличивающим img_number, вы хотите заменить что-то вроде этого:

(image)

с чем-то вроде этого:

\ 1 id = "img_ $ i" \ 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...