一致パターンを取得して順序を変更する方法はありますか?たとえば、文字が数字で、を使用している文字列がありpreg_match_all()
、結果の一致配列に文字の前に数字を含める場合です。正規表現自体でこれを指定する方法はありますか?
したがって"aaa-111"
、との一致が発生します
array(0 => '111', 1 => 'aaa');
おそらく、名前付きのキャプチャ グループが役立つでしょう。例:
preg_match('/(?<alphapart>[a-z]+)-(?<numpart>[0-9]+)/', 'aaa-111', $matches);
$マッチ:
array('alphapart' => 'asd', 'numpart' => '111')
このようにして、一致した順序のインデックスではなく、名前で一致を参照できます。
編集: 正確を期すために、 $matches には実際にはインデックスによる一致も含まれることに注意したいので、実際の $matches は次のようになります。array(5) { [0]=> string(7) "aaa-111" ["alphapart"]=> string(3) "aaa" [1]=> string(3) "aaa" ["numpart"]=> string(3) "111" [2]=> string(3) "111" }
正規表現でのグループの順序は、正規表現と文字列での位置に依存します。順序を変えると、非常に混乱します。
できることは、「名前付きグループ」を使用することです。
/(?P<letters>\w*)-(?P<digits>\d*)/
配列は同じ順序のままですが、 を使用$matches['digits']
して数字だけを簡単に取得できます。
はい、できます。'cursor'をプッシュしない先読みを使用できるため、最初に最後の部分を一致させ、次に最初の部分を一致させることができます。(?= regex)で動作します
これは機能します:
(?=\w+\-(\d+))(\w+)\-\d+
ただし、インデックス0でも完全に一致します。["aaa-111"、 "111"、 "aaa"]のように、それは問題ですか?
あるとは思わない。正規表現はソートするようには設計されていません。ただし、2つの異なる正規表現を設定して、各パターンをチェックすることもできます。このコードは、要求どおりに2つの文字列をnum/alphaの順序でエコーします。
<?php
header('Content-Type: text/plain');
$string1 = 'aaa-123';
$string2 = '123-aaa';
echo 'String 1: '.$string1."\n";
echo 'String 2: '.$string2."\n";
$pattern1 = '/([\d]+)-([a-z]+)/i';
$pattern2 = '/([a-z]+)-([\d]+)/i';
echo 'Result 1: ';
if(preg_match($pattern1, $string1, $matches))
{
echo $matches[1].' '.$matches[2]."\n";
}
if(preg_match($pattern2, $string1, $matches))
{
echo $matches[2].' '.$matches[1]."\n";
}
echo 'Result 2: ';
if(preg_match($pattern1, $string2, $matches))
{
echo $matches[1].' '.$matches[2]."\n";
}
if(preg_match($pattern2, $string2, $matches))
{
echo $matches[2].' '.$matches[1]."\n";
}
?>
結果の出力は次のとおりです。
String 1: aaa-123
String 2: 123-aaa
Result 1: 123 aaa
Result 2: 123 aaa
数字を最初に配置する場合は、配列を自分で並べ替える必要があります。
array_sort()
…あなたのためにそれを整理します。