如何匹配数组内容(从右到左)中的某些字符串?

时间:2019-06-21 12:06:31

标签: php

我有这样的音乐和弦:

<p>[Fm]      [Gm]     [Dm]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>
<p>[A]     [Asus4]    [Bb]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>

wordpress编辑器为每一行生成的“ p”标签。

我使用:用括号收集和弦。

preg_match_all("/\[[^\]]*\]/", $content , $matches);

结果是:

[0] => [Fm]
[1] => [Gm]
[2] => [Dm]
[3] => [A]
[4] => [Asus4]
[5] => [Bb]

但是我需要从右到左收集和弦,并且我的阵列应该像这样:

[0] => [Dm]
[1] => [Gm]
[2] => [Fm]
[3] => [Bb]
[4] => [Asus4]
[5] => [A]

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试通过匹配以下内容来首先捕获一行:(\[[^\]]*\])+(\<\\p\>){1} 然后,您可以获取匹配的字符串,并将其与表达式/\[[^\]]*\]/相匹配。 如果您将这些次要匹配项放入二维数组中,则现在将有一个具有以下结构的对象:

[0] => [Fm, Gm, Dm]
[1] => [A, Asus4, Bd]

一些(伪)代码:

$outputarr = [];

preg_match_all("/(\[[^\]]*\])+(\<\\p\>){1}/", $content , $matches);

foreach ($matches as &$value) {
    $internalarray = [];

    preg_match_all("//\[[^\]]*\]/", $value , $matches2);
    foreach ($matches2 as &$value2) {
        array_push($internalarray, $value2);
    }

    array_push($outputarr, $internalarray);
}

您现在可以在元素array_reverse[0]上调用[1]函数以获取:

[0] => [Dm, Gm, Fm]
[1] => [Bd, Asus4, A]

您最终可以通过执行以下操作将其从单个数组转移到另一个数组:

$arr = [];
foreach ($outputarr as &$value) {
    $arr = array_merge($arr, $value);
}

这应该给您想要的内部变量$arr

[0] => [Dm]
[1] => [Gm]
[2] => [Fm]
[3] => [Bb]
[4] => [Asus4]
[5] => [A]

ps:我没有考虑空格字符,((\[[^\]]*\]) |\s )+(\<\\p\>){1}可能更好。此外,可以使用array_merge来改进此代码,因此可以绕过手册array_push

答案 1 :(得分:1)

$content = "<p>[Fm]      [Gm]     [Dm]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>
<p>[A]     [Asus4]    [Bb]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>";


preg_match_all("/<p>.*<\/p>/", $content , $nodes);
$final = [];
foreach ($nodes[0] as $node ) {

    if(!empty($node)) {

        preg_match_all("/\[[^\]]*\]/", $node , $matches);
        if(!empty($matches[0])) {
            $final = array_merge($final, array_reverse($matches[0]));
        }
    }
}
print_r($final);