我有以下字符串:
<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);
但这没效果,我不确定为什么?
任何想法?
提前谢谢!
答案 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)
虽然您手头有工作代码,但还有其他两种可能性,即使用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
答案 2 :(得分:2)
你只需要对正则表达式进行一些修正:
<w:sz w:val="(\d)+"
所以它是:
preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);
为什么呢?因为只有 \ d ,您需要检查1个数字,但是使用 \ d + ,您需要检查1个或更多。
修改强>
如果您需要它,有一些很棒的正则表达式在线测试工具,如https://regex101.com/。在使用它们之前尝试你的表达式,以防万一。你永远不会知道;)