2015-10-07 3 views
0

То, что я пытаюсь добиться, чтобы собрать все шрифт семью в массив из строки на основе «семейство шрифтов», так что, напримерPHP значение экстракта CSS из строки

$string=" 
    Hi <span style=\"font-family: Arial \">text in Arial</span> 
    <br /> 
    A new line 
    <br /> 
    Hello again <span style=\"font-family:Courier ; font-size:12px;\"> text in courier font</span> 
    <br /> 
    Ready 
    "; 

    $array_fonts = preg_match_all(????); 

Так $ array_fonts должен содержать значения «Arial» и «Courier».

Возможно ли это?

+1

'preg_match_all' возвращает количество вхождений шаблона в строке или' false', а не массив подстрок (см http://php.net/manual/en /function.preg-match-all.php). Сначала вы должны извлекать атрибуты 'style' с помощью' DOMDocument' и использовать regex только после того, как найдете значения 'font-family'. –

ответ

0

Вы можете попробовать этот. Объяснение в коде в комментариях. Если вы действительно заинтересованы, я тоже могу объяснить шаблон.

$string = ' Hi <span style="font-family: Arial ">text in Arial</span> 
      <br /> 
      A new line 
      <br /> 
      Hello again <span style="font-family:Courier ; font-size:12px;"> text in courier font</span> 
      <br /> 
      Ready 
'; 
//Initialize the result array 
$fonts = array(); 
//Create a new DOMDocument and load the HTML string 
$Dom = new \DOMDocument(); 
$Dom->loadHTML($string); 
//Create a new DOMXPath 
$xpath = new \DOMXPath($Dom); 
//Get the spans 
$spans = $xpath->query("//span"); 
//Iterate through spans 
foreach ($spans as $span) { 
    //Get the style attribute 
    $style = $span->getAttribute('style'); 
    if ($style) { 
     //If span has style, init an array for matches 
     $matches = array(); 
     //Get the font family into the matches array 
     preg_match('@font-family(\s*):(.*?)(\s?)("|;|$)@i', $style, $matches); 
     if (!empty($matches[2])) { 
      //If found font family, trim it, and put it into the result array 
      $fonts[] = trim($matches[2]); 
     } 
    } 
} 
var_dump($fonts); 

Выход:

array (size=2) 
    0 => string 'Arial' (length=5) 
    1 => string 'Courier' (length=7) 
+0

Я не вижу смысла использовать XPath только для запроса тегов span, так как вы можете получить их с помощью $ dom-> getElementsByTagName ('span') '. Я не думаю, что OP хочет только нацеливать атрибуты стиля тегов span (это, вероятно, просто пример). В этом контексте использование XPath становится еще более уместным, если вы запрашиваете напрямую: '// @ style' или лучше:' // @ style [содержит (., "Font-family")] ' –

+0

Другое дело, вы пишете' $ style = $ span-> GetAttribute ('стиль'); if ($ style) ', чтобы проверить, имеет ли тег' span' атрибут 'style'. Это работает в этом случае, потому что нет шрифтов с именем ''0' 'или с пустой строкой (в этих двух случаях' $ style' будет оцениваться как 'false'). Теперь представьте, что вы используете то же самое, чтобы найти значение «margin», которое может быть на этот раз «0». Способ проверки, существует ли атрибут, заключается в использовании 'DOMElement :: hasAttribute' (в состоянии) перед использованием' DOMElement :: getAttribute'. –

+0

@CasimiretHippolyte Вы правы. Я просто разрабатываю парсер для веб-страниц, и в моем случае мне это нужно. Я не думал об этом, я не слишком хорошо знаком с этими функциями PHP DOM, поэтому я только что скопировал свой код и переписал. Поэтому я хотел бы дать быстрое решение для OP, если вы чувствуете, что этот код пахнет, просто скажите мне, и я удалю свой ответ. В противном случае, я надеюсь, что OP прочитает комментарии. – vaso123