regex模式和返回数组如下


regex pattern and return array like this

我想像wordpress短代码那样从字符串返回数组,但我希望数组像示例一样

我有这个字符串

$str = 'codes example : [code lang="php"]<?php  echo "Hello Wold" ; ?>[/code]  [code lang="html"]<b>Hello</b>[/code]' ;

我想返回包含

array(
   array(
     'code' => '[code lang="php"]<?php  echo "Hello Wold" ; ?>[/code]' ,
     'function' => 'code' ,
     'attr' => array( 'lang' => 'php' ) ,
     'value' => '<?php  echo "Hello Wold" ; ?>'
   ) ,
   array(
     'code' => '[code lang="html"]<b>Hello</b>[/code]' ,
     'function' => 'code' ,
     'attr' => array( 'lang' => 'html' ) ,
     'value' => '<b>Hello</b>'
   )
)

我试着用preg_match_all

我用了这个图案/[[a-z]{3,}+ *[a-z]{2,}=(.*)+ *](.*)['/[a-z]{3,}]/U

结果是

Array ( [0] => Array ( [0] => [link href="http://www.php.net" text="php"][/link] [1] => [code lang="php"][/code] [2] => [code lang="html"]Hello[/code] ) [1] => Array ( [0] => " [1] => " [2] => " ) [2] => Array ( [0] => [1] => [2] => Hello ) )

您应该编写一个解析器。这看起来可能非常复杂,但实际上非常简单。你只需要记录几件事。

大纲:

  • 逐字符读取字符串
  • 如果您看到您看到的[记录,那么您现在将查找]
  • 如果在]之前看到一个",则需要先找到另一个"
  • 当你看到]时,你就会知道"函数"answers"属性"
  • 当你找到"/函数"时,你就知道了"值"

通过这些简单的检查,您可以构建一个令牌列表,就像您的示例输出一样。

您可以尝试以下操作:

preg_match_all(
    '#(?P<block>'[(?P<tag>[a-z]{3,})'s*(?P<attr>[a-z-_]+="[^']]+")*'](?P<content>((?!'[/(?P=tag)).)*)'[/(?P=tag){1}'])#',
    'codes example : [code lang="php" test="true"]<?php  echo "Hello Wold" ; ?>[/code] [code lang="js"]console.log(''yeah!'')[/code] [noattr]no attr content[/noattr]',
    $matches,
    PREG_SET_ORDER
);
foreach ($matches as &$match) {
    $match = array_intersect_key($match, array_flip(array('block', 'tag', 'attr', 'content')));;
}
print_r($matches);

结果应该是:

Array
(
    [0] => Array
        (
            [block] => [code lang="php" test="true"]<?php  echo "Hello Wold" ; ?>[/code]
            [tag] => code
            [attr] => lang="php" test="true"
            [content] => <?php  echo "Hello Wold" ; ?>
        )
    [1] => Array
        (
            [block] => [code lang="js"]console.log('yeah!')[/code]
            [tag] => code
            [attr] => lang="js"
            [content] => console.log('yeah!')
        )
    [2] => Array
        (
            [block] => [noattr]no attr content[/noattr]
            [tag] => noattr
            [attr] =>
            [content] => no attr content
        )
)

您需要使用命名组:http://www.regular-expressions.info/named.html

摘录:

(?Pgroup)将组的匹配捕获到后参考"名称"中

EDIT:所以您需要将命名的组理念插入到您的正则表达式中。