php
  • regex
  • 2014-09-02 386 views 0 likes 
    0

    我想从字符串Passed, <strong class="has_warnings">2 warning(s)</strong>得到。我是正则表达式的noob,请帮忙。正则表达式不匹配空格和换行的模式

    $str_html = ' 
    <td colspan="2" class="valid"> 
        Passed, <strong class="has_warnings">2 warning(s)</strong> 
    </td> ' 
    
    preg_match('#<td colspan="2" class="valid">(.*?)</td>#', $str_html, $data_html_errors); 
    

    现场非格式化正则表达式可以在这里找到。

    http://regexr.com/39e45

    回答

    2

    你不需要使用任何捕获组。

    <td colspan="2" class="valid">\s*\K.*?(?=\s+<\/td) 
    

    DEMO

    +0

    捕捉组可能会减慢你的过程。 – 2014-09-02 10:14:17

    +0

    是的,这很快,10秒。 – user3467855 2014-09-02 10:39:30

    1

    你的正则表达式应该是这样的:

    /<td colspan="2" class="valid">([\s\S]*)<\/td>/ 
    

    你原来的正则表达式有几个错误:

    • .不匹配制表符,换行符,但你的字符串包含它们。
    • ?是不必要的。如果你想在td内容是可选的,在*已经表示0以上

    http://regexr.com/39e48

    这个表达式可能是更有效的:

    /<td colspan="2" class="valid">(((?!<\/td>)[\s\S])+)<\/td>/ 
    

    http://regexr.com/39e4n

    +0

    有发生,我用Ajax拉起数据一件奇怪的事情,当我加入这个表达式,它在30秒加载,它的正则表达式,业绩昂贵? – user3467855 2014-09-02 10:06:20

    +0

    @ user3467855如果你有一个非常大的文件*这个*正则表达式非常昂贵。你的档案有多大?我会尽力为您提供更适合的正则表达式。 – idmean 2014-09-02 10:26:20

    +0

    它通常是一个网页,所以可能介于10000个字符和100000个字符之间。 – user3467855 2014-09-02 10:29:49

    1
    <td[^>]*?>(.*?)<\/td> 
    

    试试这个。

    查看演示。

    http://regex101.com/r/sA7pZ0/29

    相关问题