正则表达式捕获<div>标签周围的文本?</div>

时间:2011-06-10 03:04:12

标签: regex

我有一堆产品,我需要标题和说明文字,所以我可以把它们放入一个看起来像这样的查询: INSERT INTO uc_products(标题,描述)值 ('Lafayette RK-820 4轨道立体声磁带卡座','操作和维修手册,包括零件清单&amp; amp;原型'),

信息目前收集在一些div标签中:

<div class="radio-product-wrap">
    <div class="radio-product-image">

    </div>
    <div class="radio-product-title">
        <p>Lafayette RK-820 4 track stereo tape deck</p>
    </div>
    <div class="radio-product-desript">
        <p>Operation and service manual, includes parts list &amp;amp; schematic</p>
    </div>
    <div class="radio-cart-66-wrap">
        [add_to_cart item="L-1"]
    </div>
</div>

我如何编写正则表达式来获取信息?

2 个答案:

答案 0 :(得分:3)

使用哪种目标语言?或者你只需​​要正则表达式本身?

请注意,正则表达式仅在提取HTML文档定义明确的部分时有用,并且通常不能用于解析 HTML。

如果你需要的只是一个正则表达式,你可以使用:

<div\ class="radio-product-title">    # literal div tag with class

[^<]*                                 # any chars that are not '<'

<p>                                   # literal '<p>' tag

\s*                                   # optional leading spaces

([^<]+?)                              # one or more chars that are not '<', 
                                      #   captured in to group #1
                                      # (non-greedy)

\s*                                   # optional trailing spaces

<\/p>                                 # literal '</p>' tag

[^<]*                                 # any chars that are not '<'

<\/div>                               # literal '</div>' end tag

[^<]*                                 # any chars that are not '<'

<div\ class="radio-product-desript">  # literal div tag with class

[^<]*                                 # any chars that are not '<'

<p>                                   # literal '<p>' tag

\s*                                   # optional leading spaces

([^<]+?)                              # one or more chars that are not '<', 
                                      #   captured in to group #2
                                      # (non-greedy)

\s*                                   # optional trailing spaces

<\/p>                                 # literal '</p>' tag

没有评论的同样的事情:

<div\ class="radio-product-title">[^<]*<p>\s*([^<]+?)\s*<\/p>[^<]*<\/div>[^<]*<div\ class="radio-product-desript">[^<]*<p>\s*([^<]+?)\s*<\/p>

这个正则表达式假设没有'&lt;' <p></p>标记之间的字符。如果情况并非如此,则需要进行修订。

根据您的目标语言,您可能需要告诉您的正则表达式引擎在处理过程中将源字符串视为“单行”。

完成后,匹配[1]将包含标题并匹配[2]描述。

<小时/> 编辑以响应警告评论......

虽然您无法使用正则表达式来可靠地解析任意HTML文档,但它们是从这些文档中提取元素的优秀工具IFF:

  1. 所有文件的格式都相同。
  2. 目标元素定义明确且易于识别。
  3. 警告人们在这些条件下提取数据时不要使用正则表达式是在不理解的情况下屈服于教条。

答案 1 :(得分:0)

这应该有效:

<div class="radio-product-title">.*?<p>(?<Title>.*?)</p>.*?</div>.*?<div class="radio-product-desript">.*?<p>(?<Description>.*?)</p>.*?</div>

您需要从匹配中捕获两个命名组TitleDescription