首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配数组中内容中的字符串(从右到左)?

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

Stack Overflow用户
提问于 2019-06-21 12:06:31
回答 2查看 53关注 0票数 1

我有这样的音乐和弦和歌词:

代码语言:javascript
复制
<p>[Fm]      [Gm]     [Dm]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>
<p>[A]     [Asus4]    [Bb]</p>
<p>لورم ایپسوم ، لورم ایپسوم</p>

由wordpress编辑器为每一行生成的"p“标记。

我使用以下方法收集带括号的和弦:

代码语言:javascript
复制
preg_match_all("/\[[^\]]*\]/", $content , $matches);

其结果是:

代码语言:javascript
复制
[0] => [Fm]
[1] => [Gm]
[2] => [Dm]
[3] => [A]
[4] => [Asus4]
[5] => [Bb]

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

代码语言:javascript
复制
[0] => [Dm]
[1] => [Gm]
[2] => [Fm]
[3] => [Bb]
[4] => [Asus4]
[5] => [A]

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-21 13:02:52

您可以尝试首先通过匹配到:(\[[^\]]*\])+(\<\\p\>){1}来捕获一行,然后您可以获取一个匹配的字符串,并将其与表达式:/\[[^\]]*\]/匹配。如果使用这些辅助匹配并将它们放入2d数组中,那么现在将有一个具有以下结构的对象:

代码语言:javascript
复制
[0] => [Fm, Gm, Dm]
[1] => [A, Asus4, Bd]

一些(伪)代码:

代码语言:javascript
复制
$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]来获取:

代码语言:javascript
复制
[0] => [Dm, Gm, Fm]
[1] => [Bd, Asus4, A]

最后,通过这样做,您可以从这个数组转到一个数组:

代码语言:javascript
复制
$arr = [];
foreach ($outputarr as &$value) {
    $arr = array_merge($arr, $value);
}

这将在变量$arr中给出您想要的

代码语言:javascript
复制
[0] => [Dm]
[1] => [Gm]
[2] => [Fm]
[3] => [Bb]
[4] => [Asus4]
[5] => [A]

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

票数 1
EN

Stack Overflow用户

发布于 2019-06-21 13:07:56

代码语言:javascript
复制
$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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56703151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档