php
  • regex
  • 2014-09-02 102 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

    相關問題