【问题标题】:JavaScript equivalent of php DOMDocument ObjectJavaScript 等价于 php DOMDocument 对象
【发布时间】:2020-07-27 15:11:18
【问题描述】:

我用 PHP 编写了一个代码,用于解析我通过来自“wikipedia.org”的 API 请求收到的数据。 我使用 DOMDocument 类来解析数据,它工作得非常好。现在我想在 JavaScript 中做同样的工作。 API 请求返回(经过一点清理)这样的字符串:

$htmlString = "<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>
<ul>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
</ul>"

请注意,这只是一个示例。任何请求可能有不同数量的列表,但它始终是一系列无序列表。 我需要获取 &lt;li&gt; 标签内的文本,以下 PHP 代码运行良好。

$DOM = new DOMDocument;
$DOM->loadHTML($htmlString);
$lis = $DOM->getElementsByTagName('li');
$items =[];
for ($i = 0; $i < $lis->length; $i++) $items[] = $lis[$i]->nodeValue;

然后我在$items 变量中得到了我想要的数组 [Item 1,...,Item 5]。 现在我想在 JavaScript 中做同样的工作。那就是我有一个字符串

htmlString = "<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>
<ul>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
</ul>"

在 JavaScript 中,我想获取每个 &lt;li&gt; 标记内的文本。我在网上搜索了一个与 JavaScript 中的 PHP DOMDocument 等效的类,但令人惊讶的是,我什么也没找到。 任何想法如何在类似于 PHP 代码的(最好是 Vanilla)JavaScript 中做到这一点? 如果没有,知道如何在 JavaScript 中执行此操作(甚至可能使用正则表达式)?

【问题讨论】:

  • 您是在浏览器中运行 Javascript,还是在服务器上(在 Node 等下)运行 Javascript?
  • jQuery 在这方面做得很好。它使用 css 选择器来查询 dom 中的项目。尽管它的用途相当广泛,但仍有很多批评,所以在采用之前做一些研究。
  • @iainn 我在浏览器中运行。有区别吗?
  • @danielson317 确实如此。问题是,我不想从我自己页面的 DOM 中选择 li。我需要抓取的是 html 字符串中的 li。
  • @MathCoder 你可以从一个 html 字符串创建一个 jquery 对象:$(string).find('li')

标签: javascript php html regex domdocument


【解决方案1】:

使用DOMParser()

您的移植代码,与您的 PHP 非常相似:

let parser = new DOMParser()
let doc = parser.parseFromString(`<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>
<ul>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
</ul>`, "text/html")


let lis = doc.getElementsByTagName('li')
let items = []
for (let i = 0; i < lis.length; i++) items.push(lis[i].textContent)

console.log(items)

【讨论】:

    【解决方案2】:

    如果您严格使用字符串,则需要使用正则表达式。

    仅供参考 我使用的是 ES20xx 语法。如果你不能支持这一点,你需要转换成你的用户可以访问的语法。

    在这里,我有一个表达式,可以捕获打开 &lt;ul&gt;&lt;li&gt; 和结束标签之间的任何内容。然后我使用换行符将字符串拆分为一个数组。我们需要从结果数组中过滤掉空元素,最后在最终数组中返回所需的项。

    var htmlString = `<ul>
        <li>Item 1</li>
        <li>Item 2</li>
    </ul>
    <ul>
        <li>Item 3</li>
        <li>Item 4</li>
        <li>Item 5</li>
    </ul>`;
    
    var lis = htmlString.replace(/<ul>|<li>(.*)<\/li>|<\/ul>/g, '$1').split('\n');
    
    var items = lis
        .filter(item => {
            if (item && item !== null && item !== '') {
                return item;
            }
        })
        .map(item => {
            var element = item.replace(/\s{2,}/g, '');
    
            return element;
        });
    
    console.log('items array.', items);

    【讨论】:

    • 感谢您的回答。我希望寻找与我的 php 代码或多或少相似的答案。可以在其他情况下使用的更系统的东西。但你的答案在这里工作得很好。谢谢!
    • 请用一个示例更新您的问题,以便我更好地解决您的问题。我只能按照您告诉我们的内容工作。
    猜你喜欢
    • 2011-05-29
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2015-02-10
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多