【问题标题】:[php]how to extract a single simple text from a long html source[php]如何从长 html 源中提取单个简单文本
【发布时间】:2012-08-07 09:33:59
【问题描述】:

我有一个这样的html:

......whatever very long html.....

<span class="title">hello world!</span>

......whatever very long html......

这是一个很长的 html,我只想要内容“你好世界!”从这个 html 我得到了这个 html

$result = file_get_contents($url , false, $context);

很多人都在使用简单的 HTML DOM 解析器,但我认为在这种情况下,使用正则表达式会更有效。

我应该怎么做?有什么建议么?任何帮助都会非常棒。

提前致谢!

【问题讨论】:

  • 如果您在构造正则表达式时遇到问题,您可以随时使用更简单的 split() 函数。
  • 使用正则表达式解析 HTML 通常被认为是个坏主意。可能的相关问题和...如果相关答案不是技术,它可以描述您可能通过使用正则表达式解析 HTML 来召唤我们的世界内爆stackoverflow.com/a/1732454/1428773

标签: php html regex parsing


【解决方案1】:

坚持使用 DOM 解析器 - 更好。话虽如此,您可以使用这样的正则表达式...

// where the html is stored in `$html`
preg_match('/<span class="title">(.+?)<\/span>/', $html, $m);
$whatYouWant = $m[1];

preg_match() 存储在正则表达式中括号内捕获的所有元素的数组,以及作为整个捕获字符串的第 0 个元素。在这种情况下,正则表达式非常简单,几乎是您想要的直接字符串匹配,结束跨度标记的斜杠已转义。捕获的部分仅表示任意字符 (.) 一次或多次 (+) 不贪婪 (?)。

【讨论】:

    【解决方案2】:

    不,我真的不认为 regEx 或类似函数会更有效或更简单。

    如果您使用SimpleHTML DOM,您可以像这样快速获取您要查找的数据:

    //Get your file
    $html = file_get_html('myfile.html');
    //Use jQuery style selectors
    $spanValue = $html->find('span.title')->plaintext;
    
    echo($spanValue);
    

    使用 preg_match 你可以这样做:

    preg_match("/<span class=\"title\">([^`]*?)<\/span>/", $data, $matches);
    

    或者这个,如果有多个带有“title”类的span:

    preg_match_all("/<span class=\"title\">([^`]*?)<\/span>/", $data, $matches);
    

    【讨论】:

    • 从个人经验来看,我发现当 html 字符串很长时,正则表达式会更好。 SimpleHTML DOM 太慢,达到内存限制[在这种情况下]。
    • 有时,是的——这绝对是一种选择。然而,使用正则表达式可能会让人头疼——例如,如果在示例中的跨度内有多个跨度怎么办?如果 HTML 格式错误怎么办?
    • 当我使用这个库来获取一个以某些东西开头的类的链接时,我发现它可以像在 jquery 中使用 ^= 一样完成。现在,当我在库文件中搜索^= 时,我发现它确实在使用正则表达式!我感到震惊。最终,我使用了正则表达式,因为我使用库达到了内存限制。现在,听到你说正则表达式不会比 simplehtmldom 有效,我觉得你部分不正确,因为库使用了正则表达式!我也意识到图书馆的其他部分也很好。但这是另一回事。
    • 好吧,我会买那个 =) 但是——正如我所说,使用“纯”正则表达式很少会更容易,因为你不能指望 HTML 绝对正确,简单HTML DOM 将帮助您解决这个问题。但是,是的,简单的 HTML DOM 存在一些主要的内存问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2010-11-11
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多