3

テキスト ファイル (「file.txt」) があります。

5 (blah-blah) 001  
2 (blah) 006  

行 [番号] でパターンを検索して、最初の単語、括弧内の式、および最後の 3 桁または 4 桁の数字を見つける PHP コードを使用します。

<?php  
// file  
$file = file("file.txt");  

/* first line */
// match first word (number)  
preg_match("/^(\d+)/",$file[0],$first_word);  

// match expression within parentheses  
preg_match("/(?<=\().*(?=\))/s",$file[0],$within_par);  

// match last 3- & 4-digit numbers  
preg_match("/(\d{3,4})?(?!.*(\d{3,4}))/",$file[0],$last_word); 

/* repeats (second line) */  
preg_match("/^(\d+)/",$file[1],$first_word2);  
preg_match("/(?<=\().*(?=\))/s",$file[1],$within_par2);  
preg_match("/(\d{3,4})?(?!.*(\d{3,4}))/",$file[1],$last_word2); 
<?php

そして、一致を 1 行ずつ表示する HTML コードは次のとおりです。

<div>
    <p><?php echo $first_word[0] ?></p>
    <p><?php echo $within_par[0] ?></p>
    <p><?php echo $last_word[0] ?></p>
</div>
<div>
    <p><?php echo $first_word2[0] ?></p>
    <p><?php echo $within_par2[0] ?></p>
    <p><?php echo $last_word2[0] ?></p>
</div>

しかし、PHP コードと HTML コードの両方で、それぞれを個別にリストすることなく、すべての一致を表示できるようにしたいと考えています。preg_match_all を使用してテキスト ファイルを検索し、すべての一致を foreach して、一度に 1 つの div (3 つのパターン) でそれぞれをエコー/返したいと思います。(私はいくつかの異なる方法を試しましたが、結果として配列を取得しました。) これを達成できるコードは何ですか?

4

2 に答える 2

0

次を使用してデータを抽出できます。

$matches = array();
preg_match_all("/([0-9]+) \(([a-zA-Z-]+)\) ([\d]+)/", $text, $matches);

たとえば、テキスト上:

$text = "5 (blah-blah) 001 \n 6 (bloh-bloh) 002";

結果は次のようになります。

Array
(
    [0] => Array
        (
            [0] => 5 (blah-blah) 001
            [1] => 6 (bloh-bloh) 002
        )

    [1] => Array
        (
            [0] => 5
            [1] => 6
        )

    [2] => Array
        (
            [0] => blah-blah
            [1] => bloh-bloh
        )

    [3] => Array
        (
            [0] => 001
            [1] => 002
        )
)

したがって、を使用してファイルのコンテンツを読み取ると、を適用してすべてのデータを取得file_get_contentsできるはずです。preg_match_all

于 2013-03-18T21:47:48.613 に答える
0
<?php

$string = "5 (blah-blah) 001  
2 (blah) 006";

$result = preg_match_all("/(\d+)\s+\((.*?)\)\s+(\d+)/", $string, $matches);

if (count($matches) > 0) {
    unset($matches[0]);

    $sets = array();

    foreach ($matches as $key => $value) {
        foreach ($value as $key2 => $value2) {
            $sets[$key2][] = $value2;
        }
    }

    foreach ($sets as $key => $values) {
        echo '<div style="background-color: red;">';
        foreach ($values as $ind => $value) {
            echo '<p>'.$value.'</p>';
        }
        echo '</div>';
    }

    // Direct output (without an internal loop)
    foreach ($sets as $key => $values) {
        echo '<div style="background-color: orange;">';
        echo '<p>'.$values[0].'</p>';
        echo '<p>'.$values[1].'</p>';
        echo '<p>'.$values[2].'</p>';
        echo '</div>';
    }
}

?>

$setsこれで、正しいコレクションに値が含まれます。必要に応じてデータを出力するための foreach ループを追加しました。

于 2013-03-18T22:01:27.330 に答える