0

WordPress ショートコードのような文字列があり、属性を抽出する必要があります。:
[prefix action="foo" class="bar"][/prefix]

この構造を正確に維持する必要があるため、引用符を削除して次のようにすることはできません。action=foo

今私はWordPressの正規表現パターンを使用しました:

// Grabs [prefix foo="bar"][/prefix] from the $content
$pattern = '/\[(\[?)(' . PREFIX . ')(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\2\])[^\[]*+)*+)\[\/\2\])?)(\]?)/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);

これは結果です:

Array
 (
     [0] => [prefix action="foo" class="bar"][/prefix]
     [1] => 
     [2] => prefix
     [3] =>  action="foo" class="bar"
     [4] => 
     [5] => 
     [6] => 
 )

次に、正規表現の一致をループします

foreach( $matches as $block )
    {
    /*
     * I'm not working on WordPress platform, 
     * But I used function shortcode_parse_atts
     */
    $attr = shortcode_parse_atts( $block[3] );

結果:

Array
(
    [action] => "foo"
    [class] => "bar"
)

そして最後にextract($attr)。しかし、ご覧のとおり$class$action値は二重引用符で囲まれています。だから私はそれらの引用符に乗る必要があります。

要するに:
$class = "bar"$class = bar

なぜstr_replaceorを使わないのかと思う場合に備えてpreg_replace、私はやったのですが、どういうわけか引用符を削除しませんでした (理由はわかりません)

4

2 に答える 2

1

これは属性配列です。質問の出力に$array示されているように:print_r()

Array (
    [action] => "foo"
    [class] => "bar"
)

print_r()値の一部として引用符が実際に存在しない限り、引用符を出力しません。この場合は明らかに存在します。使用できる引用符を削除するには、次のような関数を使用str_replace()します。array_map()

$clean = array_map(function($item) {
    return str_replace("\"", "", $item);
}, $array);

print_r($clean);

次に、次のようになります。

Array (
    [action] => foo
    [class] => bar
)
于 2013-07-24T11:37:51.837 に答える