【问题标题】:"You can't parse HTML with regex" WHY? [closed]“你不能用正则表达式解析 HTML” 为什么? [关闭]
【发布时间】:2012-08-24 13:29:56
【问题描述】:

我知道我的问题似乎重复了(duplicate)... 但特别是我并没有尝试解析“True/Valid” HTML,它是 javascript 变量/或 HTML 标记的一部分,请参见我的示例:

                <td width="10"></td>
            <td ><div id="combo_rub" style="CURSOR:pointer"></div><input type="hidden" id="rech_cod_cat"  name="rech_cod_cat" value="1"/></td>
            <td ><div id="combo_typ" style="CURSOR:pointer"></div></td>
            <td ><div id="combo_sou_typ" style="CURSOR:pointer"></div></td>

            <script type="text/javascript">
            d_rech_cod_rub       = "101";
            d_rech_cod_typ       = "1";
            d_rech_cod_sou_typ   = "1020121";

            //ComboBox sous_type
            var z_sou_typ=new dhtmlXCombo("combo_sou_typ","rech_cod_sou_typ",160);

所以我想要在我的代码 PHP 中检索 (d_rech_cod_rub, d_rech_cod_typ, d_rech_cod_sou_typ) 从 Javascript 部分的值,而不是从 HTML 中,如您所见...

第二种情况是:

<td><a href="AnnoncesImmobilier.asp?rech_cod_rub=101&amp;rech_cod_typ=1">
<font color="#2154eb">Location (6920)</font></a> </td></tr></table></td></tr>
<tr><td><table width="100%" cellpadding="0" cellspacing="0"><tr>   
<td><a href="AnnoncesImmobilier.asp?rech_cod_rub=101&amp;rech_cod_typ=5"></td>      

同样,我需要检索 '101' 值...

最后,完整的故事:我经常使用 PHP 的 Curl 扩展,然后遇到类似上述示例的内容......问题是当我使用 HTML 解析器时,如 (http://simplehtmldom.sourceforge.net/)我无法完成我的工作,因为它只适用于有效的 HTML ..:( 我的问题:有什么解决方案可以稳定地检索值吗? 遇到像我这样的情况你会怎么做?

谢谢大家。

编辑:所以根据大多数答案,使用 RegX 可以解决问题...

【问题讨论】:

  • 使用更宽容的 html 解析器。你认为浏览器遇到那个 html 时在做什么?
  • @Jocelyn:正如我在我的问题中已经说过的不是重复的问题,我不想解析 HTML 标签,只是文本的一小部分
  • 由于您的文本位于包含 HTML 标签的文件中,我认为使用正则表达式不是一个好主意。这就是我链接到的页面上的解释。
  • JS的问题和(X)HTML的问题几乎一模一样。 JS 不是常规语言(它是上下文无关的,AFAIK),并且 RE 往往不擅长解析非常规语言。过了某个点,即使使用我们现代增强的“RE”,这也是不可能的……甚至在此之前,你会沮丧地扯掉你的头发。如果您有一个已知样本,并且无法容忍偏差,那么您可以轻松获取特定的文本块...但是您想要的越通用,RE 的用处就越少get -- 使用真正的解析器越容易。

标签: php regex html-parsing


【解决方案1】:

以下正则表达式可以解决问题

d_rech_cod_[a-z_ ]*= "([0-9]*)";
rech_cod_rub=([0-9]*)

不确定 PHP,但您可以使用以下代码对其进行评估:

preg_match($regex, $content, $matches);
print($matches[1]);

【讨论】:

    【解决方案2】:

    如果你想要的只是那个值,那么就很容易使用正则表达式:

    d_rech_cod_rub\s*=\s*"([0-9]+)";
    

    第一个捕获组是您的价值。

    【讨论】:

    • 如果您希望它适用于所有 d_rech 变量,您可以添加另一个捕获组:(d_rech_cod_[a-z_]+)\s*=\s*"([0-9]+)";
    【解决方案3】:

    在更具体的答案中,正则表达式无法处理嵌套信息。

    例如...

    <span>Hello <span>World</span></span>
    

    查找&lt;span&gt;.*&lt;\/span&gt; 的正则表达式将返回:

    <span>Hello <span>World</span>
    

    我们甚至不会提及尝试处理缺少标签的无效 HTML。

    this (loadHTML) 之类的东西可能是您想要的。

    【讨论】:

      【解决方案4】:

      我不确定是否可以使用一个正则表达式来完成您想要的操作,但肯定可以使用每个变量使用一个正则表达式。也可以使用strpos 函数来解析字符串。这里第二种方法可能会更有效。

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2021-07-20
        • 2014-12-06
        相关资源
        最近更新 更多