Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:preg_match()不正确_Php_Regex_Simplexml_Domdocument_Docx - Fatal编程技术网

PHP:preg_match()不正确

PHP:preg_match()不正确,php,regex,simplexml,domdocument,docx,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: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>

我试图使用preg_match()解析“w:sz w:val”值

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

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

preg_match('/您试图仅捕获一位数。请尝试添加+以生成“一个或多个”


preg_match('/您只需要对正则表达式进行一点修改:

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

<代码> > p>当你手边有一个工作代码时,还有两种可能性,即用<代码> DOMDOCTON/<代码>和<代码> SimpleXML <代码>。这对于冒号(AKA命名空间)来说有点棘手,但是考虑下面的例子。我已经添加了一个容器标签来定义命名空间,但是在XML中也肯定有一个容器标签。 解决方案1(使用
DOM
方式)使用名称空间前缀搜索DOM并读取属性。解决方案2(使用
SimpleXML
方式)执行相同的操作(可能更直观、更容易理解)

XML:(使用PHP语法)

解决方案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

您,先生,真是太棒了。这正是问题所在。谢谢。哦,对不起。您说得对!我马上纠正它。为什么不:?@AbraCadaver我已经看了一点。您知道有没有其他PHP库或软件包可以将docx xml转换为html?从未使用过它,但这里有一个:@jldavis76使用
DomDocument和下面的
SimpleXML
。这看起来确实很有趣。当我尝试第二种解决方案时,我得到一个错误:消息:试图获取非对象的属性。知道为什么吗?@jldavis76您可以使用
var\u dump($items)
以查看是否首先找到了项。请记住,目前这只适用于我的xml,因为我已经创建了一个名称空间。显然,您必须使用自己的名称空间。我想我只是对名称空间在这方面的使用有点不熟悉。我必须进一步研究它。谢谢。
<w:sz w:val="(\d)+"
preg_match('/<w:sz w:val="(\d+)"/', $p, $fonts);
$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;
$dom = new DOMDocument();
$dom->loadXML($xml);

$ns = 'http://example';

$data = $dom->getElementsByTagNameNS($ns, 'sz')->item(0);
$attr = $data->getAttribute('w:val');
echo $attr; // 24
$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