次の文字列を指定します。
- [ダウンロードID="1"]
- [ダウンロード ID="1" 属性=""]
- [ダウンロード属性="" id="1"]
- [attr="" id="1" attr="" をダウンロード]
ID は常に数字です。PHP経由で使用される数値を常に提供する正規表現が必要です。
preg_match_all('/id="(\d+)"/', $data, $matches);
これが私の解決策です:
<?php
$content =
<<<TEST
[download id="1"]
[download id="2" attr=""]
[download attr="" id="3"]
[download attr="" id="4" attr=""]
TEST;
$pattern = '/\[download.*[ ]+id="(?P<id>[0-9]+)".*\]/u';
if (preg_match_all($pattern, $content, $matches))
var_dump($matches);
?>
単一行の入力($ matches ['id'] [0]で読み取る)または複数行の入力(例のように、 $ matches ['id']配列で反復する)で機能します。
ノート:
http://it.php.net/manual/en/function.preg-match-all.php
http://it.php.net/manual/en/reference.pcre.pattern.modifiers.php
上記の例はこれを出力します:
array(3) {
[0]=>
array(4) {
[0]=>
string(17) "[download id="1"]"
[1]=>
string(25) "[download id="2" attr=""]"
[2]=>
string(25) "[download attr="" id="3"]"
[3]=>
string(33) "[download attr="" id="4" attr=""]"
}
["id"]=>
array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
}
[1]=>
array(4) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
}
}
したがって、 $matches['id']配列でループしているID属性を読み取ることができます:)
これを試してください:
/\[download.*?id=\"(\d+)\"/
呼び出された関数:
preg_match_all('/\[download.*?id=\"(\d+)\"/', '{{your data}}', $arr, PREG_PATTERN_ORDER);
id
常に 1 つのフィールドがあり、常に引用符 ( ) で囲まれていると仮定すると、次"
のような正規表現を試すことができますid="(\d+)"
。これにより、番号がキャプチャされ、グループに入れられます。これらのグループにアクセスする方法については、こちらをご覧ください。
提案されているように、より多くのフィールドに一致させたい場合は、正規表現を削除して、渡す文字列を解析できるものを見つけることをお勧めします。
これも解決策でしょう
\[download[^\]]*id="(\d*)
グループ1をキャプチャすることで結果が得られます
ここでRegexrを参照してください
\[download
「[ダウンロード」に一致
[^\]]*
否定された文字クラスで、"]" 以外のすべてに一致します (o 回以上)
id="
文字通り「id="」に一致
(\d*)
は 0 以上の数字に一致するキャプチャ グループです。1 つ以上に一致*
するように を aに変更できます。+
必要に応じて正規表現ではなく、簡単にiniファイルを使用できます。次に例を示します。
test.ini
[download]
id=1
attr = ""
[download2]
id=2
attr = "d2"
およびindex.php
$ini = parse_ini_file('test.ini', true);
print_r($ini);