регулярное выражение — PHP: preg_match () не правильно

У меня есть следующая строка:

<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);

но это не сработало, и я не уверен, почему?

Есть идеи?

Заранее спасибо!

2

Решение

Вы пытались захватить только однозначные числа. Попробуйте добавить +, чтобы сделать «один или несколько».

preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);

Я предпочитаю [0-9] + для более удобного чтения, и потому что это избегает потенциально забавной необходимости удваивать символы \.

preg_match('/<w:sz w:val="([0-9]+)"/', $p, $fonts);
4

Другие решения

Пока у вас есть рабочий код, есть две другие возможности, а именно: 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
3

Вам просто нужно немного исправить свое регулярное выражение:

<w:sz w:val="(\d)+"

Такие вот дела:

preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);

Зачем? Потому что только \ d вы проверяете на 1 цифру, но с \ D + Вы проверяете на 1 или более.

РЕДАКТИРОВАТЬ:

Если вам это нужно, есть несколько отличных инструментов онлайн-тестирования, например https://regex101.com/. Попробуйте свои выражения там, прежде чем использовать их, на всякий случай. Никогда не знаешь 😉

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector