获取 HTML 字符串中所有 <li> 标签的文本值[重复]

问题描述 投票:0回答:4

我有一个字符串,我想从中解析所有

<li></li>
标签,这就是字符串。

<li>Want this</li>DON'T WANT THIS<li>Want this</li>DON'T WANT THIS<li>Want this</li>...

这是我正在使用的代码:

$my_text= array();
preg_match('/<li>(.*?)<\/li>/', $str, $my_text);

但这不起作用。当我运行它时,这是 my_text 数组:

[0] => "<li>Want this</li>"
[1] => "Want this"

1000 个元素中只有 2 个元素。

php html html-parsing text-extraction listitem
4个回答
2
投票

Toto 是正确的,这是一个非常简单的修复:

$str = "<li>Want this</li>DON'T WANT THIS<li>Want this</li>DON'T WANTTHIS<li>Want this</li>";

$my_text= array();
preg_match_all('/<li>(.*?)<\/li>/', $str, $my_text);

1
投票

我可以提出另一个基于 SimpleXMLxpath 查询 的解决方案吗?

<?php
$string = "<html>
            <li>Want this</li>DON'T WANT THIS<li>Want this</li>DON'T WANT THIS<li>Want this</li>
        </html>";

$xml = simplexml_load_string($string);
# select only the li elements where the text is equal to...
$elements = $xml->xpath("//li[text() = 'Want this']");
print_r($elements);
// yields a list of your desired elements
?>

提示:您的正则表达式也可以工作,请参阅regex101.com上的演示。但请考虑使用其他分隔符:

$regex = '~<li>(.+?)</li>~';
preg_match_all($regex, $string, $matches);
print_r($matches);

0
投票

您所需要的就是使用

preg_match_all()
函数,如下所示:

<?php

$str = "<li>Want this</li>DON'T WANT THIS<li>Want this</li>DON'T WANT THIS<li>Want this</li>";
preg_match_all('/<li>(.*?)<\/li>/', $str, $out);
echo '<pre>';
print_r($out);

在线演示


0
投票

按照上面的建议使用 preg_match_all。这确实是最好的解决方案。

preg_match_all("|<[^>]+>(.*)</[^>]+>|U", $input, $result, PREG_SET_ORDER);

上面的示例将从输入中删除所有 html 标签,而不仅仅是 li。

© www.soinside.com 2019 - 2024. All rights reserved.