我有这样的音乐和弦和歌词:
<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]谢谢。
发布于 2019-06-21 13:02:52
您可以尝试首先通过匹配到:(\[[^\]]*\])+(\<\\p\>){1}来捕获一行,然后您可以获取一个匹配的字符串,并将其与表达式:/\[[^\]]*\]/匹配。如果使用这些辅助匹配并将它们放入2d数组中,那么现在将有一个具有以下结构的对象:
[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来改进此代码。
发布于 2019-06-21 13:07:56
$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);https://stackoverflow.com/questions/56703151
复制相似问题