【问题标题】:Regex help, greedy vs. non-greedy正则表达式帮助,贪婪与非贪婪
【发布时间】:2009-06-05 13:26:22
【问题描述】:

嘿,我有一个大的 html 字符串,比如

<a style="background: rgb(100, 101, 43) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-backg    round-inline-policy: -moz-initial;" href="#">swatch4</a>  
<a style="background: rgb(34, 68, 33) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-b    ackground-inline-policy: -moz-initial;" href="#">swatch5</a>  
<a style="background: rgb(11, 38, 68) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -m    oz-background-inline-policy: -moz-initial;" href="#">swatch6</a>  
<a style="background: rgb(39, 11, 60) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial    ; -moz-background-inline-policy: -moz-initial;" href="#">swatch7</a>

...有很多这样的条目...

我最终想要的是一个 php 数组

$colors = array(
 'rgb(34, 34, 33)',
 'rgb(11, 38, 68)',
...
); 

等等。

我需要帮助来提取字符串的 rgb 部分。我的正则表达式吃太多字符串时遇到问题。任何帮助将不胜感激,我想把它记下来并学习如何去做(而不是仅仅完成它)。顺便说一句,我正在使用 vim。

谢谢

【问题讨论】:

    标签: php html regex parsing


    【解决方案1】:

    简单的正则表达式是

    (rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\))
    

    每个“\s*\d{1,3}\s*”表示:

    • 匹配空格(空格,如 ' ',或制表符,正如 molf 在 cmets 中所说,数字从 0 到 inf)
    • 匹配一个数字(从 1 到 3 位,因为你从 0 到 255)
    • 匹配其他空格
    • 匹配逗号 (,)

    数组部分可以使用 Paolo 的代码。

    【讨论】:

    • 我会用 \s* 替换空格,首先是为了澄清意图(匹配任何空格),其次是因为它还允许制表符。
    【解决方案2】:
    preg_match_all('/rgb\(\d{1,3}, \d{1,3}, \d{1,3}\)/', $string, $matches);
    print_r($matches);
    

    如果您不确定间距,请使用:

    preg_match_all('/rgb\(\d{1,3},\s?\d{1,3},\s?\d{1,3}\)/', $string, $matches);
    print_r($matches);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2011-04-27
      • 2010-10-20
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多