- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个简单的例子,展示了我想用 CSS 做什么。
示例输入:
html {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #222222;
}
期望的输出:
html {
font-family: Helvetica, Arial, sans-serif;
color: #222222;
}
.pt-sans html {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #222222;
}
我一直在使用 https://github.com/sabberworm/PHP-CSS-Parser但是示例不够详细,我无法弄明白。
这是我目前所拥有的:
<?php
$css_string = '
html {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #222222;
}';
// Create parser.
$oSettings = Sabberworm\CSS\Settings::create()->withMultibyteSupport(false);
$oCssParser = new Sabberworm\CSS\Parser($css_string, $oSettings);
$oCssDocument = $oCssParser->parse();
// Get font-family rules.
foreach($oCssDocument->getAllRuleSets() as $key0 => $oRuleSet) {
$rules = $oRuleSet->getRules('font-family');
if (!empty($rules)) {
foreach ($rules as $key1 => $values) {
var_dump(array($key0, $key1));
var_dump($values->getValue());
}
}
}
输出这个
array (size=2)
0 => int 0
1 => int 0
object(Sabberworm\CSS\Value\RuleValueList)[91]
protected 'aComponents' =>
array (size=4)
0 =>
object(Sabberworm\CSS\Value\String)[85]
private 'sString' => string 'PT Sans' (length=7)
1 => string 'Helvetica' (length=9)
2 => string 'Arial' (length=5)
3 => string 'sans-serif' (length=10)
protected 'sSeparator' => string ',' (length=1)
之所以要这样做是为了异步字体加载https://www.filamentgroup.com/lab/font-events.html我会在哪里运行这样的 js 代码。
<script src="//cdn.rawgit.com/bramstein/fontfaceobserver/master/fontfaceobserver.js"></script>
<script>
var observer = new window.FontFaceObserver("PT Sans", {});
observer.check(null, 5000).then(function () {
window.document.documentElement.className += " pt-sans";
});
</script>
编辑:我现在有这个
$oSettings = Sabberworm\CSS\Settings::create()->withMultibyteSupport(false);
$oParser = new Sabberworm\CSS\Parser($css_string, $oSettings);
$oDoc = $oParser->parse();
$external_fonts_used = array();
foreach($oDoc->getAllRuleSets() as $key0 => $oRuleSet) {
$rules = $oRuleSet->getRules('font-family');
if (!empty($rules)) {
foreach ($rules as $key1 => $values) {
$get_value = $values->getValue();
if ($get_value instanceof Sabberworm\CSS\Value\RuleValueList) {
foreach ($get_value->getListComponents() as $key2 => $value) {
if ($value instanceof Sabberworm\CSS\Value\String) {
$external_fonts_used[$key0] = $value->getString();
}
}
}
if ($get_value instanceof Sabberworm\CSS\Value\String) {
$external_fonts_used[$key0] = $get_value->getString();
}
}
}
}
var_dump($external_fonts_used);
这给了我
array (size=1)
0 => string 'PT Sans' (length=7)
这意味着我可以定位正确的 CSS 规则并阅读信息;现在我需要修改和复制它们。
最佳答案
最终创建了我自己的简单 css 解析器来执行此操作,因为它要快得多。
$css_string = '
html {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #222222;
}';
// Get the CSS that contains a font-family rule.
$length = strlen($css_string);
$porperty = 'font-family';
$replacements = array();
while (($last_position = strpos($css_string, $porperty, $last_position)) !== FALSE) {
// Get closing bracket.
$end = strpos($css_string, '}', $last_position);
if ($end === FALSE) {
$end = $length;
}
$end++;
// Get position of the last closing bracket (start of this section).
$start = strrpos($css_string, '}', - ($length - $last_position));
if ($start === FALSE) {
$start = 0;
}
else {
$start++;
}
// Get closing ; in order to get the end of the declaration.
$declaration_end = strpos($css_string, ';', $last_position);
// Get values.
$start_of_values = strpos($css_string, ':', $last_position);
$values_string = substr($css_string, $start_of_values + 1, $declaration_end - ($start_of_values + 1));
// Parse values string into an array of values.
$values_array = explode(',', $values_string);
// Values array has more than 1 value and first element is a quoted string.
if (count($values_array) > 1 && (strpos($values_array[0], '"') || strpos($values_array[0], "'"))) {
// Remove first value and render css rule.
$removed_value = strtolower(trim(str_replace(array('"', "'"), '', $values_array[0])));
$removed_value = str_replace(' ', '-', $removed_value);
unset($values_array[0]);
$new_values_array = implode(',', $values_array);
// Get all selectors.
$end_of_selectors = strpos($css_string, '{', $start);
$selectors = substr($css_string, $start, $end_of_selectors - $start);
// From advagg_load_stylesheet_content().
// Perform some safe CSS optimizations.
// Regexp to match comment blocks.
$comment = '/\*[^*]*\*+(?:[^/*][^*]*\*+)*/';
// Regexp to match double quoted strings.
$double_quot = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
// Regexp to match single quoted strings.
$single_quot = "'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
// Strip all comment blocks, but keep double/single quoted strings.
$selectors_stripped = preg_replace(
"<($double_quot|$single_quot)|$comment>Ss",
"$1",
$selectors
);
// Add css class to all the selectors.
$selectors_array = explode(',', $selectors_stripped);
foreach ($selectors_array as &$selector) {
$selector = ' .' . $removed_value . ' ' . $selector;
}
$new_selectors = implode(',', $selectors_array);
// Get full rule set.
$full_rule_set = substr($css_string, $start, $end - $start);
// Replace values.
$new_full_rule_set = str_replace($values_string, $new_values_array, $full_rule_set);
// Replace selectors.
$new_full_rule_set = str_replace($selectors, $new_selectors, $new_full_rule_set);
// Record info.
$replacements[] = array($full_rule_set, $new_full_rule_set, $removed_value);
}
// Advance position.
$last_position = $end;
}
foreach ($replacements as $replace) {
$css_string = str_replace($replace[0], $replace[0] . $replace[1], $css_string);
}
输出:
html {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #222222;
} .pt-sans
html {
font-family: Helvetica, Arial, sans-serif;
color: #222222;
}
关于PHP:解析 CSS 文件,找到引用的字体系列值,复制没有引用字体的规则/选择器,将类添加到所有具有该字体名称的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31174437/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!