代码之家  ›  专栏  ›  技术社区  ›  Christian

删除标记并添加注释链接

  •  0
  • Christian  · 技术社区  · 14 年前

    注意:输入的HTML是可信的;它不是用户定义的!

    我将用一个例子来强调我需要什么。

    给出以下HTML:

    <p>
      Welcome to <a href="http://google.com/" class="crap">Google.com</a>!<br>
      Please, <a href="enjoy.html">enjoy</a> your stay!
    </p>
    

    我想把它转换成:

    Welcome to Google.com[1]
    Please, enjoy[2] your stay!
    
    [1] http://google.com/
    [2] %request-uri%/enjoy.html    <- note, request uri is something I define
                                       for relative paths
    

    我想定制它。


    编辑:进一步说,我最好解释一下我自己和我的理由。

    我们有一个自动模板系统(带Sylesheets!)对于电子邮件和作为系统的一部分,我希望生成包含HTML和文本的多部分电子邮件。 系统只提供HTML。

    我需要有意义地将这个HTML转换为文本,例如,我想以某种方式保留任何链接和图像,也许是以我上面指定的格式。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Gumbo    14 年前

    你可以使用 DOM 要执行以下操作:

    $doc = new DOMDocument();
    $doc->loadHTML('…');
    
    $anchors = array();
    foreach ($doc->getElementsByTagName('a') as $anchor) {
        if ($anchor->hasAttribute('href')) {
            $href = $anchor->getAttribute('href');
            if (!isset($anchors[$href])) {
                $anchors[$href] = count($anchors) + 1;
            }
            $index = $anchors[$href];
            $anchor->parentNode->replaceChild($doc->createElement('a', $anchor->nodeValue." [$index]"), $anchor);
        }
    }
    $html = strip_tags($doc->saveHTML());
    $html = preg_replace('/^[\t ]+|[\t ]+$/m', '', $html);
    foreach ($anchors as $href => $index) {
        $html .= "\n[$index] $href";
    }