用于在两个标记之间提取文本的正则表达式以及标记名称

0 php regex xml

我需要一种简单的标记语言来在TEXT字段中存储字符串的不同部分,然后提取这些部分.所以基本上我想要一些简单的XML.将这些存储在表字段中很容易,但是提取它们是另一回事.我设法使用为常规HTML完成的简单正则表达式:

|<[^>]+>(.*)</[^>]+>|U
Run Code Online (Sandbox Code Playgroud)

但是为了重新组合原始数组(并且更普遍地使用标记),我还需要知道标记名称.那个正则表达式不会这样做.

例子:

输入文本:

<user_input>Hello! my name is Williams</user_input>
Run Code Online (Sandbox Code Playgroud)

使用上述正则表达式的preg_match_all()函数返回:

array
  0 => 
    array
      0 => string '<user_input>Hello! my name is Williams</user_input>' (length=34)

  1 => 
    array
      0 => string 'Hello! my name is Williams' (length=34)
Run Code Online (Sandbox Code Playgroud)

我需要它来返回标签的"user_input"名称.是的,我知道,我很喜欢正则表达式.是的,我知道"使用XML解析器",但这对我正在做的事情来说太大了.

med*_*iev 6

xml解析器如何"太大"?PHP具有内置的本机功能,可以让您轻松完成.

正则表达式不适合这项工作.

<?php

$string = '
<root>
<input_name>blah</input_name>
</root>
';

$x = new DOMDocument();
$x->loadXML($string);
$root = $x->documentElement;
$elements = $root->getElementsByTagName('*');
$count = count($elements->length);

for ( $i = 0; $i< $count; $i++ ) {
    $el = $elements->item($i);
    echo $el->nodeName . '<br>';
    echo $el->nodeValue . '<br>';
}
Run Code Online (Sandbox Code Playgroud)