Чтобы удалить зазор под изображением, вы можете:
vertical-align: bottom;
vertical-align: top;
или vertical-align: middle;
display:block;
См. следующий код для живой демонстрации:
#vAlign img {
vertical-align :bottom;
}
#block img{
display:block;
}
div {border: 1px solid red;width:100px;}
img {width:100px;}
No fix:
With vertical-align:bottom; on image:
With display:block; on image:
Разрыв или дополнительное пространство под изображением не является ошибкой или проблемой, это поведение по умолчанию. Основная причина заключается в том, что изображения заменяются элементами ( см. MDN и W3C ). Это позволяет им «действовать как изображение» и иметь собственные собственные размеры, соотношение сторон ... Браузеры вычисляют свое свойство отображения inline
, но они придают им особое поведение, которое приближает их к элементам inline-block
(так как вы
Это также означает, что:
[...] когда изображения используются во встроенном контексте форматирования с выравниванием по вертикали: базовая линия, нижняя часть изображения будет отображаться на базовой линии контейнера. ( source: MDN , focus mine )
blockquote>Поскольку браузеры по умолчанию вычисляют свойство vertical-align для базовой линии, это значение по умолчанию поведение. На следующем изображении показано, где базовая линия находится по тексту:
[/g15]
Элементы, выровненные по базовой линии, должны содержать место для дескрипторов которые простираются ниже базовой линии (например,
j, p, g ...
), как вы можете видеть на приведенном выше изображении. В этой конфигурации нижняя часть изображения выравнивается по базовой линии, как вы можете видеть в этом примере:
div{border:1px solid red;} img{width:100px;height:auto;}
jpq are letters with descenderВот почему поведение по умолчанию тега
создает пробел в нижней части его контейнера и почему изменение свойства вертикального выравнивания или свойства отображения удаляет его, как в следующей демонстрации:
div {width: 100px;border: 1px solid red;} img {width: 100px;height: auto;} .block img{ display:block; } .bottom img{ vertical-align:bottom; }
Default:
With display:block;
With vertical-align:bottom;
Если бы мой предпочтительный язык не предложил способ сделать это, не думая тогда, что я первоначально рассмотрел бы две возможности как простой способ:
Предварительный синтаксический анализ и замена запятые в строке с другим управляющим символом тогда разделяют их, сопровождаемый постсинтаксическим анализом на массиве для замены управляющего символа, используемого ранее с запятыми.
, Кроме того, разделяет их на запятых, тогда постанализируют полученный массив в другую проверку массива продвижение кавычек на каждой записи массива и конкатенации записей, пока я не достиг завершающейся кавычки.
Это взломы однако, и если это - чистое 'умственное' осуществление тогда, я подозреваю, что они окажутся бесполезными. Если бы это - проблема реального мира тогда, она помогла бы знать язык так, чтобы мы могли дать некоторый определенный совет.
Python:
import csv
reader = csv.reader(open("some.csv"))
for row in reader:
print row
Похож у Вас есть некоторые хорошие ответы здесь.
Для тех из Вас смотрящий на дескриптор Ваш собственный парсинг файла CSV, учтите совет от экспертов, и не прокручивают Ваш собственный синтаксический анализатор CSV .
Ваша первая мысль, , "Я должен обработать запятые в кавычках".
Ваша следующая мысль будет, , "О, дерьмо, я должен обработать кавычки в кавычках. Завершенные кавычки. Двойные кавычки. Одинарные кавычки..."
Это - дорога к безумию. Не пишите свое собственное. Найдите библиотеку с обширным покрытием модульного теста, которое поражает все твердые части и прошло ад для Вас. Для.NET используйте свободное библиотека FileHelpers.
Конечно, использование синтаксического анализатора CSV лучше, но просто ради удовольствия Вы могли:
Loop on the string letter by letter.
If current_letter == quote :
toggle inside_quote variable.
Else if (current_letter ==comma and not inside_quote) :
push current_word into array and clear current_word.
Else
append the current_letter to current_word
When the loop is done push the current_word into array
Я использую это для парсинга строк, не уверенных, если это помогает здесь; но с некоторыми незначительными модификациями, возможно?
function getstringbetween($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
$fullstring = "this is my [tag]dog[/tag]";
$parsed = getstringbetween($fullstring, "[tag]", "[/tag]");
echo $parsed; // (result = dog)
/ член парламента
Автор здесь заглядывал блобу кода C#, который обрабатывает сценарий, с которым у Вас есть проблема:
не Должен быть слишком трудным для перевода.
, Что, если нечетное число кавычек появляется в исходной строке?
Это странно походит на парсинг CSV, который имеет некоторые особенности к обработке заключенных в кавычки полей. Поля только оставляют, если поле разграничено с двойными цитатами, таким образом:
field1, "field2, field3", field4, "field5, field6" field7
становится
field1
field2, Уведомление field7
"field5
field6" field3
field4
, если это и не запускается и заканчивается цитатой, тогда это не заключенное в кавычки поле, и двойные кавычки просто рассматривают как двойные кавычки.Insedently мой код, что кто-то связанный с на самом деле не обрабатывает это правильно, если я вспоминаю правильно.
Это - стандартный синтаксический анализ стиля CSV. Много людей пытается сделать это с регулярными выражениями. Можно добраться приблизительно до 90% с regexes, но Вам действительно нужен реальный синтаксический анализатор CSV, чтобы сделать это правильно. Я нашел быстрый, превосходный синтаксический анализатор CSV C# на CodeProject несколько месяцев назад, что я настоятельно рекомендую!
def parsecsv(instr):
i = 0
j = 0
outstrs = []
# i is fixed until a match occurs, then it advances
# up to j. j inches forward each time through:
while i < len(instr):
if j < len(instr) and instr[j] == '"':
# skip the opening quote...
j += 1
# then iterate until we find a closing quote.
while instr[j] != '"':
j += 1
if j == len(instr):
raise Exception("Unmatched double quote at end of input.")
if j == len(instr) or instr[j] == ',':
s = instr[i:j] # get the substring we've found
s = s.strip() # remove extra whitespace
# remove surrounding quotes if they're there
if len(s) > 2 and s[0] == '"' and s[-1] == '"':
s = s[1:-1]
# add it to the result
outstrs.append(s)
# skip over the comma, move i up (to where
# j will be at the end of the iteration)
i = j+1
j = j+1
return outstrs
def testcase(instr, expected):
outstr = parsecsv(instr)
print outstr
assert expected == outstr
# Doesn't handle things like '1, 2, "a, b, c" d, 2' or
# escaped quotes, but those can be added pretty easily.
testcase('a, b, "1, 2, 3", c', ['a', 'b', '1, 2, 3', 'c'])
testcase('a,b,"1, 2, 3" , c', ['a', 'b', '1, 2, 3', 'c'])
# odd number of quotes gives a "unmatched quote" exception
#testcase('a,b,"1, 2, 3" , "c', ['a', 'b', '1, 2, 3', 'c'])
передачи Вот простой алгоритм:
'"'
символ '"'
символ. #COMMA#
'"'
, отметьте те объекты в массиве, где индексный % 2 == 0 ','
символ. #COMMA#
заполнители с ','
символ. Heres реализация Python:
(прикрепленный к дескриптору '"a, b", c, "d, e, f, h", "я, j, k"')
def parse_input(input):
quote_mod = int(not input.startswith('"'))
input = input.split('"')
for item in input:
if item == '':
input.remove(item)
for i in range(len(input)):
if i % 2 == quoted_mod:
input[i] = input[i].replace(",", "#COMMA#")
input = "".join(input).split(",")
for item in input:
if item == '':
input.remove(item)
for i in range(len(input)):
input[i] = input[i].replace("#COMMA#", ",")
return input
# parse_input('a,"string, with",various,"values, and some",quoted')
# -> ['a,string', ' with,various,values', ' and some,quoted']
# parse_input('"a,b",c,"d,e,f,h","i,j,k"')
# -> ['a,b', 'c', 'd,e,f,h', 'i,j,k']
Я просто не мог сопротивляться, чтобы видеть, мог ли я заставить его работать в остроте Python:
arr = [i.replace("|", ",") for i in re.sub('"([^"]*)\,([^"]*)"',"\g<1>|\g<2>", str_to_test).split(",")]
Возвраты ['строка, с', 'различный', 'значения и некоторые', 'заключенный в кавычки']
Это работает первой заменой'', в заключает в кавычки к другому разделителю (|), разделяя строку на'', и заменяя | разделитель снова.