PHP 预匹配不起作用


PHP preg match not working

我有一个来自女巫的str,我想解析所有<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"

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

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);

我可以提出另一种基于SimpleXML和xpath查询的解决方案吗?

<?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);

您所需要的只是使用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);

在线演示

如上所述,使用preg_match_all。这确实是最好的解决方案。

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

上面的例子将从输入中删除任何 html 标签,而不仅仅是 li。