HTML-тег соответствия регулярному выражению, НЕ содержащий другой тег - PullRequest
1 голос
/ 18 августа 2010

Я пишу регулярное выражение поиска / замены, которое вставит <span> в каждый <a href> в файле, где <span> еще не существует. Это позволит другим тегам быть в <a href> как <img>, <b> и т. Д.

В настоящее время у меня есть это регулярное выражение:
Найти: (<a[^>]+?style=".*?color:#(\w{6}).*?".*?>)(.+?)(<\/a>)
Заменить: '$1<span style="color:#$2;">$3</span>$4'

Он отлично работает, за исключением случаев, когда я запускаю его поверх того же файла, он вставит <span> внутрь <span> и станет грязным.

Пример цели:

Мы хотим, чтобы это игнорировалось:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><span style="color:#bfbcba;">Howdy</span></a>

Но не это:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;">Howdy</a>

или это:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><img src="myimg.gif" />Howdy</a>

- EDIT -

Используя библиотеку PHP DOM, как было предложено в комментариях, это то, что я имею до сих пор:

$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
    $spancount = $tag->getElementsByTagName("span")->length;
    if($spancount == 0){
        $element = $doc->createElement('span');
        $tag->appendChild($element);
    }
}

echo $doc->saveHTML();`

В настоящее время он обнаружит, есть ли промежуток внутри якоря, и если он есть, он добавит промежуток к внутренней части якоря, однако мне еще предстоит выяснить, как получить исходное содержимое якоря внутри пролет

1 Ответ

4 голосов
/ 18 августа 2010

Не используйте для этого регулярные выражения, это не идеально для HTML.

Используйте библиотеку DOM и getElementsByTagName('a'), затем выполните итерацию каждого якоря и посмотрите, содержит ли он элемент sub span с getElementsByTagName('span'), используя свойство length. Если этого не произойдет, appendChild или назначьте firstChild узла привязки для нового диапазона, созданного с помощью document.createElement('span').

РЕДАКТИРОВАТЬ: Что касается захвата внутреннего HTML-кода привязки, если внутри много узлов, попробуйте использовать это:

<?php
function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}

$html = innerHTML( $anchorRef );

Это также может вам помочь: Изменить innerHTML элемента php DOME

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