我有这样的音乐和弦:
<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]
谢谢。
答案 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);