【问题标题】:PHP: Get DOM attribute with encoding preservedPHP:获取保留编码的DOM属性
【发布时间】:2017-09-06 18:54:39
【问题描述】:

我目前正在使用 PHP DOM 解析 HTML 文档中的一些标签。我想获取“关键字”元标记未更改的内容属性值。

例如,字符串“keyword1,keyword2,keyword2,keyword3”返回“keyword1,keyword2,keyword2,keyword3”,因此会破坏输出 XML 文档中关键字的实际数量。

我已经尝试过使用“htmlentities()”,但它没有做任何事情。

【问题讨论】:

  • 需要明确的是,“keyword2,keyword2”应该是一个关键字,因此恰好是重复的关键字,例如“Johnson & Johnson”,或者实际上是两个关键字并且您正在尝试删除重复值。此外,正如您所知,大多数主要搜索引擎不再使用关键字元标记;所以,我不知道这是否会影响做你想做的事情的重要性。
  • 是的。 "keyword2,keyword2" 是单个关键字。
  • 你试过用explode(",",$string)吗?
  • 另外,是的,我知道大多数搜索引擎不再使用它。我将它用作一些自动生成的 XML 的替代品。
  • 在这种情况下我会选择正则表达式,但也许 DOMDocument: 替代实体在这里会有所帮助:php.net/manual/en/…

标签: php dom


【解决方案1】:

我知道这已经晚了,但是在我重新访问我的代码进行一些编辑后,我通过正则表达式找到了解决方案。

function GetMetaTagsContentIntact($html, $meta_name)
{
    $get_attribute_value = function($attrib, $tag)
    {
        //get attribute from html tag
        $re = '/' . preg_quote($attrib) . '=([\'"])?((?(1).+?|[^\s>]+))(?(1)\1)/is';
        if (preg_match($re, $tag, $match))
        {
          return urldecode($match[2]);
        }
        return false;
    };

    $output; // Get all meta tags.
    preg_match_all("|<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"?[^>]+>|i", $html, $output, PREG_PATTERN_ORDER);
    $output = $output[0];
    // Get specified mata tag's content value.
    foreach($output as $tag)
    {
        if($meta_name == trim($get_attribute_value("name", $tag)))
        {
            return $get_attribute_value("content", $tag);
        }
    }

    return false;
}

这需要原始的 HTML(最好是解析的),并使用正则表达式来获取元标记本身,然后从中提取您想要的元标记中的内容值。

但是,要成功地附加数据,比如像我这样的 XML 文档,您需要专门使用“textContent”。更多信息在这里:PHP: DOMNode - Manual

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2020-11-03
    • 2011-01-24
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多