5

我目前有大量 HTML 文本,并且有几个类似于以下内容的 CSS 属性:

font:16px/normal Consolas;
font:16px/normal Arial;
font:12px/normal Courier;

它还与其他几个 CSS 属性和其他相关的 HTML 值和标签捆绑在一起。

我一直在尝试编写一个只会抓取这些“字体样式”的正则表达式,所以如果我有以下两段:

<p style='font:16px/normal Arial; font-weight: x; color: y;'>Stack</p>
<span style='color: z; font:16px/normal Courier;'>Overflow</span>
<br />
<div style='font-family: Segoe UI; font-size: xx-large;'>Really large</div>

它只会匹配font:以分号开头和结尾的属性;

我玩过使用RegexHero,我得到的最接近的是:

\b(?:font[\s*\\]*:[\s*\\]*?(\b.*\b);)

结果如下:

font:bold;                   //Match
font:12pt/normal Arial;      //Match
font:16px/normal Consolas;   //Match
font:12pt/normal Arial;      //Match
property: value;             //Not a Match
property: value value value; //Not a Match

但是当我尝试放入一大块 HTML 时,事情似乎变得混乱,并且选择了大块而不是在先前指定的范围内。

我很乐意提供任何其他信息和测试数据。

4

5 回答 5

5

尝试这个

\b((?:font:[^;]*?)(?:;|'))

解释

\b             # Assert position at a word boundary
(              # Match the regular expression below and capture its match into backreference number 1
   (?:            # Match the regular expression below
      font:          # Match the characters “font:” literally
      [^;]           # Match any character that is NOT a “;”
         *?             # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
   )
   (?:            # Match the regular expression below
                     # Match either the regular expression below (attempting the next alternative only if this one fails)
         ;              # Match the character “;” literally
      |              # Or match regular expression number 2 below (the entire group fails if this one fails to match)
         &apos;              # Match the character “&amp;apos;” literally
   )
)
于 2012-06-13T15:13:03.463 回答
4

你已经离开了.*贪婪,这意味着它会吃又吃,只会停在最后一个可用的分号处。添加一个问号,即使.*?其不贪婪。

更新:

    \b(?:font\s*?:\s*([^;>]*?)(?=[;">}]))

我已经在http://rubular.com/r/yRcED2n6wu测试了此页面上的每个示例

于 2012-06-13T15:10:13.433 回答
2

试试这个正则表达式:

(?:font:[^;]*);

它与font:16px/normal Arial;font:16px/normal Courier;上面的代码段相匹配。

于 2012-06-13T15:11:02.660 回答
1

我建议:

\bfont\s*:\s*([^;}"'<>]+)(?<=\S)

这也适用于其他答案失败的情况。例如:

.foo { font: sans-serif 80% }
... style="font: sans-serif 80%" ...
于 2012-06-13T16:02:58.750 回答
0

我不太确定你在问什么,但我认为这个问题可以通过用 CSS 替换你的样式标签来解决。可以通过将以下内容放在 HTML 的 Head 标记中来解决该问题。

<style type="text/css">

h1 {

    font-family: Arial;
    font-size: 15;
    font-style:oblique;

}

h2 {
    font-family: Courier;
    font-size: 16;
    font-style:oblique;
 }
 h3 {
    font-family: Segoe UI;
    font-size: xx-large;
    font-style:oblique;
 }


</style>

现在,要使表达式(或您自己)设置其中一种字体样式,您所要做的就是用这样的标签将其包围:

<h1> Cool Text!  </h1>

祝你好运!

于 2012-06-13T15:11:00.117 回答