3

我有一个文本文件(“file.txt”):

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

使用 PHP 代码通过在 line[number] 中搜索模式来查找第一个单词、括号中的表达式和最后 3 位或 4 位数字:

<?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

以及用于逐行显示匹配项的 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 所有匹配项,并回显/返回每个匹配项,一次一个 div(具有三个模式)。(我尝试了几种不同的方法,但结果我得到了一个数组。)什么代码可以完成这个?

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 回答