PHP:preg_match()不正确

时间:2015-11-12 19:25:10

标签: php regex simplexml domdocument docx

我有以下字符串:

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

我试图解析&#34; w:sz w:val&#34;值使用preg_match()。

到目前为止,我已经尝试过了:

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

但这没效果,我不确定为什么?

任何想法?

提前谢谢!

3 个答案:

答案 0 :(得分:4)

您试图仅捕获一位数字。尝试添加一个+来制作一个或多个&#34;。

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

我更喜欢[0-9] +以便于阅读,因为它避免了对\符号加倍的潜在有趣需求。

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

答案 1 :(得分:3)

虽然您手头有工作代码,但还有其他两种可能性,即使用DomDocumentSimpleXML。对于冒号(也称为命名空间),这有点棘手,但请考虑以下示例。我添加了一个容器标签来定义命名空间,但你肯定也会在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

答案 2 :(得分:2)

你只需要对正则表达式进行一些修正:

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

所以它是:

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

为什么呢?因为只有 \ d ,您需要检查1个数字,但是使用 \ d + ,您需要检查1个或更多。

修改

如果您需要它,有一些很棒的正则表达式在线测试工具,如https://regex101.com/。在使用它们之前尝试你的表达式,以防万一。你永远不会知道;)