1

似合うものを見つけたい

[^1] and [/^1]

例:件名がこのような場合

sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]

abcdef と 12345 を要素とする配列を取得したいと考えています。

私はこれを読みました

そして、私はこのコードを書きましたが、[] 間の過去の検索を進めることができません

<?php


$test = '[12345]';

getnumberfromstring($test);

function getnumberfromstring($text)
{
    $pattern= '~(?<=\[)(.*?)(?=\])~';
    $matches= array();
    preg_match($pattern, $text, $matches);

    var_dump($matches);
}

?>
4

3 に答える 3

1

あなたのテストは、の「開始」と「終了」'[12345]'を持つという規則に適用されない文字列をチェックします。また、使用すべきときに使用しています:これを試してください:[^digit][\^digit]preg_matchpreg_match_all

<?php


$test = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';

getnumberfromstring($test);

function getnumberfromstring($text)
{
    $pattern= '/(?<=\[\^\d\])(.*?)(?=\[\/\^\d\])/';
    $matches= array();
    preg_match_all($pattern, $text, $matches);

    var_dump($matches);
}

?>
于 2012-08-02T04:00:28.060 に答える
1

その他の答えは、実際にはあなたのケースには当てはまりません。区切り文字はより複雑で、開始区切り文字の一部を使用して終了区切り文字と一致させる必要があります。また、タグ内の数字が 1 桁に制限されていない限り、後読みを使用して最初の数字を照合することはできません。通常の方法でタグを照合し、キャプチャ グループを使用してコンテンツを抽出する必要があります。(とにかく、これは私がやった方法です。後読みは決して最初に手を伸ばすツールであってはなりません。)

'~\[\^(\d+)\](.*?)\[/\^\1\]~'

開始区切り文字からの番号は最初のグループに取り込まれ、後方参照\1は同じ番号と一致するため、区切り文字が正しくペアになっていることが保証されます。区切り文字の間のテキストは、グループ #2 に取り込まれます。

于 2012-08-02T04:04:04.597 に答える
0

PHP 5.4.5 で次のコードをテストしました。

<?php
$foo = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';    
function getnumberfromstring($text)
{    
    $matches= array();
    # match [^1]...[/^1], [^2]...[/^2]
    preg_match_all('/\[\^(\d+)\]([^\[\]]+)\[\/\^\1\]/', $text, $matches, PREG_SET_ORDER);    
    for($i = 0; $i < count($matches); ++$i)
        printf("%s\n", $matches[$i][2]);
}
getnumberfromstring($foo);

?>

出力:

abcdef
123456
于 2012-08-02T04:01:55.263 に答える