0

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

4

3 に答える 3

1

パーサーを作成する必要があります。これは信じられないほど複雑に思えるかもしれませんが、実際には非常に単純です。追跡する必要があるのは、いくつかのことだけです。

概要:

  • 文字列を 1 文字ずつ読み取る
  • あなたがそれを見たという[記録を見たら、あなたは今探しているでしょう]
  • "前にa が表示された場合は、最初]に別の a を検索する必要があります。"
  • 見る]と、「関数」と「属性」がわかります
  • 「/関数」を見つけたら、「値」がわかります

これらの簡単なチェックを使用すると、出力例のようにトークンのリストを作成できます。

于 2013-08-05T15:07:52.060 に答える
0

名前付きグループを使用する必要があります: http://www.regular-expressions.info/named.html

抜粋:

(?Pgroup) は、グループの一致を後方参照「名前」に取り込みます

編集:名前付きグループのアイデアを正規表現に挿入する必要があります。

于 2013-08-05T15:08:42.140 に答える
0

次のようなことを試すことができます:

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
        )

)
于 2013-08-05T22:34:47.797 に答える