Заменить все элементы & lt; a & gt; теги в строке, кроме одного конкретного идентификатора с использованием preg_replace

У меня есть этот HTML-код:

$html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="font-family: Helvetica Neue, Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

</head>

<body itemscope itemtype="http://schema.org/EmailMessage" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6">

<table class="body-wrap" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6"><tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"></td>
<td class="container" width="600" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;" valign="top">
<div class="content" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;">
<table class="main" width="100%" cellpadding="0" cellspacing="0" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;" bgcolor="#fff"><tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<td class="alert alert-warning" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #1ab394; margin: 0; padding: 20px;" align="center" bgcolor="#1ab394" valign="top">
Following change has occurred in the 1st fault 4 notification.
</td>
</tr><tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-wrap" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 20px;" valign="top">
<table width="100%" cellpadding="0" cellspacing="0" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td id="notification-detail" class="content-block" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
<a class="btn-link removable no-padding" href="javascript:void(0);" onclick="goToListingByType()">Fault</a>, <a class="btn-link no-padding" href="javascript:void(0);"onclick="goToDetailPageByType()">1st fault 4 notification, 14077</a> Naveed Saleem has updated the Due date of this Activity to 23rd November, 2016
</td>
</tr>
<tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
<a href="{{URL}}" id="login-link" class="btn-primary" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #1ab394; margin: 0; border-color: #1ab394; border-style: solid; border-width: 10px 20px;">Login Whuntu</a>
</td>
</tr><tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
Thanks for choosing Company Inc.
</td>
</tr></table></td>
</tr></table><div class="footer" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
<table width="100%" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<tr style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<td class="aligncenter content-block" style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;" align="center" valign="top">Copyright © 2014-2016, Company Name, United Kingdom. All rights reserved.</td>
</tr></table></div></div>
</td>
<td style="font-family: Helvetica Neue,Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"></td>
</tr></table></body>
</html>
';

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

Я абсолютный новичок в регулярных выражениях. Может кто-нибудь, пожалуйста, помогите. Я нашел это регулярное выражение, которое заменяет все теги, основанные на классе:

$html = preg_replace('/<(a).*?class="\s*(?:.*\s)?removable(?:\s[^"]+)?\s*"[^\>]*>(.*)<\/\1>/i', '\2', $html);

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

Большое спасибо за вашу помощь

0

Решение

Если вы хотите проанализировать структурированный язык, используйте эту структуру, а не анализируйте ее как простой текст. PHP предоставляет встроенные инструменты для анализа HTML и XML:

  • DOMDocument класс для построения и редактирования дерева DOM
  • DOMXPath класс для запроса дерева DOM

Пример:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

$xp = new DOMXPath($dom);

// select all the link nodes that don't have an id attribute
// to discard a specific id, you can change the predicate to: not(@id="yourid")
$linkNodeList = $xp->query('//a[not(@id)]');

foreach ($linkNodeList as $linkNode) {
// create a new span element where to store all children nodes of the link node
$spanNode = $dom->createElement('span');
// append each child node to the span node
foreach($linkNode->childNodes as $childNode) {
$spanNode->appendChild($childNode->cloneNode(true));
}
// replace the link node with the span node
$linkNode->parentNode->replaceChild($spanNode, $linkNode);
}

echo $dom->saveHTML();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]