【问题标题】:PHP How to replace html tags with valuesPHP如何用值替换html标签
【发布时间】:2020-11-09 07:24:41
【问题描述】:

我在一个文本文件中有数千个静态 HTML 行,我想保留一个名为“num”的特定 HTML 标记之间的“H-number”值,并使用 PHP 将其转换为链接。例如,HTML 字符串如下所示:

</tvm><br><num>H7585</num></td><td><font color="#663399">...

从这里我想得到<num>H7585</num>的部分并将它变成这样的东西,保持“H-number”值:

</tvm><br><a href="https://link-here.php?id=H7585"><num>H7585</num></a></td><td><font color="#663399">...

但是,像H7585 这样的所有“H 编号”代码都是不同的,它们不在 PHP 变量中,因为所有内容都是 HTML 文本字符串。我已经尝试过 PHP 函数 preg_match 和 preg_replace 但我无法提出解决方案。

我尝试过的就是这个。但我不知道如何让不同的 H 值显示或显示:

$string = '...</tvm><br><num>H7585</num></td><td><font color="#663399">......</tvm><br><num>H72000</num></td><td><font color="#663399">......</tvm><br><num>H8525</num></td><td><font color="#663399">...'; - (虽然这样的行有数千行,但 H 码不同)。

$string = preg_replace("/<num>(.+?)<\\/num>/is", "<a href=display_value_here><num>display_value_here</num></a>", $string);

$echo $string;

有人可以帮帮我吗?我真的很感激。

【问题讨论】:

标签: javascript php html function dynamic


【解决方案1】:

您可以使用DOMDocument API,方法是创建一个文档,将您的 HTML 加载到其中,使用 XPath 查找所需的节点,然后用新创建的链接元素替换它们:

$domDocument = new \DOMDocument();
$domDocument->loadHTML(utf8_decode($markup), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOWARNING | LIBXML_NOERROR);
$domDocument->encoding = 'utf-8';

$xpath = new DOMXPath($domDocument);

/** @var DOMElement $numElement */
foreach ($xpath->query('//num') as $numElement) {
  $linkElement = $domDocument->createElement('a');
  $linkElement->setAttribute('href', "https://link-here.php?id={$numElement->textContent}");
  $numElement->parentNode->replaceChild($linkElement, $numElement);
  $linkElement->appendChild($numElement);
}

$newMarkup = $domDocument->saveHTML();

演示:https://3v4l.org/XJ8Zi

注意:不建议使用正则表达式解析 XML/HTML。

【讨论】:

  • 非常感谢您的帮助。该代码完美运行,这正是我所需要的。我要感谢你花时间帮助我。继续努力!
  • 我有一个问题。我可以在代码中进行哪些更改,以使输出保持完整的带有特殊重音或字符的单词?
  • @Arlo 检查更新的代码(我没有更新演示链接,只是答案中的代码)。
  • 更新效果很棒!所有 utf-8 字符现在都显示重音符号。代码效果很好!对此,我真的非常感激。如果字符串还包含希腊字母和其他重音符号,例如 Azōr 或 Ἀζὼρ,那么除了 utf-8,还有什么不同的选项?
【解决方案2】:
<?php
$str = '</tvm><br><num>H7585</num></td><td><font color="#663399">......</tvm><br><num>H72000</num></td><td><font color="#663399">......</tvm><br><num>H8525</num></td><td><font color="#663399">';
$res = preg_replace('/<num>(.+?)<\/num>/i','<a href="$1"><num>$1<\/num><\/a>', $str);
var_dump($res);

您的匹配正则表达式中有 \ 额外内容。您也可以使用$1 来表示您捕获的值。

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2015-07-22
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多