У меня есть следующая строка:
<w:pPr>
<w:spacing w:line="240" w:lineRule="exact"/>
<w:ind w:left="1890" w:firstLine="360"/>
<w:rPr>
<w:b/>
<w:color w:val="00000A"/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
и я пытаюсь проанализировать значение «w: sz w: val» с помощью preg_match ().
Пока что я пробовал:
preg_match('/<w:sz w:val="(\d)"/', $p, $fonts);
но это не сработало, и я не уверен, почему?
Есть идеи?
Заранее спасибо!
Вы пытались захватить только однозначные числа. Попробуйте добавить +, чтобы сделать «один или несколько».
preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);
Я предпочитаю [0-9] + для более удобного чтения, и потому что это избегает потенциально забавной необходимости удваивать символы \.
preg_match('/<w:sz w:val="([0-9]+)"/', $p, $fonts);
Пока у вас есть рабочий код, есть две другие возможности, а именно: DomDocument
а также SimpleXML
, Это несколько сложно с двоеточиями (пространства имен), но рассмотрим следующие примеры. Я добавил тег контейнера, чтобы определить пространство имен, но он наверняка будет и в вашем xml.
Решение 1 ( DOM
способ) ищет DOM с префиксом пространства имен и читает атрибуты. Решение 2 (с SimpleXML
) делает то же самое (возможно, более интуитивно и понятно).
XML: (с использованием синтаксиса PHP HEREDOC)
$xml = <<<EOF
<?xml version="1.0"?>
<container xmlns:w="http://example">
<w:pPr>
<w:spacing w:line="240" w:lineRule="exact"/>
<w:ind w:left="1890" w:firstLine="360"/>
<w:rPr>
<w:b/>
<w:color w:val="00000A"/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
</container>
EOF;
Решение 1: Использование DomDocument
$dom = new DOMDocument();
$dom->loadXML($xml);
$ns = 'http://example';
$data = $dom->getElementsByTagNameNS($ns, 'sz')->item(0);
$attr = $data->getAttribute('w:val');
echo $attr; // 24
Решение 2: Использование SimpleXML с пространствами имен
$simplexml = simplexml_load_string($xml);
$namespaces = $simplexml->getNamespaces(true);
$items = $simplexml->children($namespaces['w']);
$val = $items->pPr->rPr->sz["val"]->__toString();
echo "val: $val"; // val: 24
Вам просто нужно немного исправить свое регулярное выражение:
<w:sz w:val="(\d)+"
Такие вот дела:
preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);
Зачем? Потому что только \ d вы проверяете на 1 цифру, но с \ D + Вы проверяете на 1 или более.
РЕДАКТИРОВАТЬ:
Если вам это нужно, есть несколько отличных инструментов онлайн-тестирования, например https://regex101.com/. Попробуйте свои выражения там, прежде чем использовать их, на всякий случай. Никогда не знаешь 😉