Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从html中提取多个_Php_Html_Regex_Xml_Dom - Fatal编程技术网

Php 从html中提取多个

Php 从html中提取多个,php,html,regex,xml,dom,Php,Html,Regex,Xml,Dom,我正在尝试提取下面标记中的单词。我的正则表达式工作得很好,但只给了我第一个,Lorem ipsum… 我对regex相当陌生,我知道通过遍历DOM来实现这一点可能更可靠,但在这种情况下,regex更受欢迎。你知道我需要改变什么才能得到所有的结果,而不仅仅是一个吗 /[\s\s]+[\s\s]*?(([\s\s]*?)+[\s\s]*?/ Lorem ipsum dolor sit amet,是一位杰出的献身者。 耳道前庭。 拉库斯、萨皮恩、毛里斯等家族成员。 米塞纳斯在伊普苏姆

我正在尝试提取下面
  • 标记中的单词。我的正则表达式工作得很好,但只给了我第一个
  • Lorem ipsum…

    我对regex相当陌生,我知道通过遍历DOM来实现这一点可能更可靠,但在这种情况下,regex更受欢迎。你知道我需要改变什么才能得到所有的结果,而不仅仅是一个吗

    /[\s\s]+
      [\s\s]*?(
    • ([\s\s]*?)+[\s\s]*?/

    
    
    • Lorem ipsum dolor sit amet,是一位杰出的献身者。
    • 耳道前庭。
    • 拉库斯、萨皮恩、毛里斯等家族成员。
    • 米塞纳斯在伊普苏姆康塞特图,菲尼布斯埃特,调味品turpis。

    在末尾添加全局
    g
    标志。例如:

    /<div class="foo-bar">[\s\S]+<ul>[\s\S]*?(<li>([\s\S]*?)<\/li>)+[\s\S]*?<\/ul>/g
    
    /[\s\s]+
      [\s\s]*?(
    • ([\s\s]*?)+[\s\s]*?/g

    您可能还需要区分大小写的
    i
    标志

    最好将以下内容与
    preg\u match\u all()
    一起使用。我刚测试过,它正在工作

    首先
    preg\u match\u all
    以下内容仅获取`

    /<div class="foo-bar">([\s\S]*?)+<ul>([\s\S]*?)<\/ul>([\s\S]*?)<\/div>/
    

    使用DOM+Xpath而不是正则表达式

    $document = new DOMDocument();
    $document->loadHTML($html);
    $xpath = new DOMXpath($document);
    
    foreach($xpath->evaluate('//div[@class="foo-bar"]/ul/li') as $li) {
      var_dump($li->textContent);
    }
    
    输出:

    string(80) "
                Lorem ipsum dolor sit amet, consectetur adipiscing elit.
            "
    string(75) "
                Vestibulum iaculis nibh ac orci imperdiet ultrices.
            "
    string(95) "
                Fusce neque lacus, feugiat eget sapien eget, ullamcorper rutrum mauris.
            "
    string(89) "
                Maecenas in ipsum consectetur, finibus ex et, condimentum turpis.
            "
    

    你的PHP代码是什么样子的?不要使用正则表达式。使用解析器。要使用正则表达式,您需要提取完整的
    ul
    ,然后解析出每个
    li
    。它们还不存在,只需原型化正则表达式即可。只需要像上面那样整理一个片段。请看:我也读过了。:)我仍然认为它适合你的问题,因为你可能要求一个正则表达式做太多的事情。PHP中没有
    g
    。函数是否为全局函数。@chris85而不是
    g
    您可以使用
    preg\u match\u all()
    function@funilrys是的,
    函数是全局函数还是非全局函数。
    仍然没有
    g
    修饰符。@funillys是的
    preg\u match\u all()
    仍然只匹配一个:(@Eamonn是的,这不是答案。正则表达式不能像你想要的那样工作。这就是我需要的,但它也需要
    包装器来阻止它与其他东西匹配。@Eamonn我相信,在一个正则表达式中不可能做到这一点。将它分成两个正则表达式?看起来这就是解决方案。如果你想更新你的ans答案是我会接受的。@Eamonn编辑了我的答案。你能测试一下吗?答案很好。我做了。你可能不想使用XML解析器,但它是更好的解决方案。因此,我为可能有相同问题的其他人发布了更多答案,并找到了你的问题。
    $document = new DOMDocument();
    $document->loadHTML($html);
    $xpath = new DOMXpath($document);
    
    foreach($xpath->evaluate('//div[@class="foo-bar"]/ul/li') as $li) {
      var_dump($li->textContent);
    }
    
    string(80) "
                Lorem ipsum dolor sit amet, consectetur adipiscing elit.
            "
    string(75) "
                Vestibulum iaculis nibh ac orci imperdiet ultrices.
            "
    string(95) "
                Fusce neque lacus, feugiat eget sapien eget, ullamcorper rutrum mauris.
            "
    string(89) "
                Maecenas in ipsum consectetur, finibus ex et, condimentum turpis.
            "