Preg_match文本文件并在单个代码中显示多个结果

时间:2013-03-18 21:39:32

标签: php html foreach preg-match

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

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

使用PHP代码通过在行[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在文本文件中搜索,然后预测所有匹配,并一次回显/返回每个,一个div(有三个模式)。 (我尝试了几种不同的方法,但结果却得到了一个数组。)什么代码可以实现这个目标?

2 个答案:

答案 0 :(得分: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并检索所有数据。

答案 1 :(得分: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循环来打印出你想要的数据。