使用正则表达式删除锚标记内的标头标记

时间:2017-09-08 15:32:30

标签: php regex

我知道已经提出了几个类似的问题。但无法使用正则表达式解决此问题。

在我有标题

的任何帖子中
<h1><a href="#hello">link text</a>Title with header tag </h1>
<h2><a href="http://so.com">link text</a>Title with header tag</h2>

我尝试使用锚标记链接和文本从标记标记中删除锚标记。但不是标题标题。

这是我的正则表达式,它也删除了我的标题文本。

(<h[1-2].*?>)<a.*?>

并且

(<h([1-6])[^>]*>)\s?<a>(.*)?<\/a>\s?(<\/h\2>)

这是 URL

我的最终结果将是。

<h1>Title with header tag </h1>
<h2>Title with header tag</h2>

2 个答案:

答案 0 :(得分:1)

DOM方式为您的字符串设置DOMDocument对象,并为您的链接使用xpath对象。这些将在之后删除。

<?php

$html = <<<DATA
<body>
    <h1><a href="#hello">link text</a>Title with header tag </h1>
    <h2><a href="http://so.com">link text</a>Title with header tag</h2>
</body>
DATA;

$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DomXPath($dom);

$links = $xpath->query("//a[parent::h1|parent::h2]");
foreach ($links as $link) {
    $link->parentNode->removeChild($link);
}

echo $dom->saveHTML();

?>

不要为所有事情使用正则表达式。

答案 1 :(得分:0)

这是一个正则表达式,它将为您提供特定的"hello"

(?<=<h[12]><a href="#)[^"]*

    <h[12]><a                  Search for a <a> tag inside of a <h1> or a <h2>...
              href="#          ... that has a href attribute starting with a hash
(?<=                 )         If a string matches that...
                      [^"]*    ... then take all that follows until the closing quotes

为了删除锚点,以下正则表达式将为您提供全部href属性:

(?<=<h[12]><a) *href="#.*"    

    <h[12]><a                 Search a <a> tag inside of a header tag
(?<=         )                If a string matches that...
               *              ... take all the spaces...
                href="#       ... then the href attribute, the opening quotes, and the hash...
                       .*     ... then whatever...
                         "    ... until the closing quotes  

您可以使用以下正则表达式删除完整的<a>标记:

(?<=<h[12]>)<a *href="#.*".*>

然后使用这个简单的正则表达式删除结束标记:

</a>

Here是phplivergex.com的链接,您可以在其中查看替换结果。