Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Preg_匹配文本文件并在一个代码中显示多个结果_Php_Html_Foreach_Preg Match - Fatal编程技术网

Php Preg_匹配文本文件并在一个代码中显示多个结果

Php Preg_匹配文本文件并在一个代码中显示多个结果,php,html,foreach,preg-match,Php,Html,Foreach,Preg Match,我有一个文本文件(“file.txt”): 使用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

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

使用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


但我希望能够显示所有匹配项,而不必在PHP代码和HTML代码中单独列出每个匹配项。我想使用preg_match_all在文本文件中搜索,然后foreach all match,并一次回显/返回每一个,一个div(有三个模式)。(我尝试了几种不同的方法,但结果得到了一个数组。)什么代码可以实现这一点?

您可以使用以下方法提取数据:

$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\u get\u contents
读取文件内容,您应该能够应用
preg\u match\u all
并检索所有数据。


<?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>';
    }
}

?>

现在,
$set
将在正确的集合中包含您的值。我已经添加了一个foreach循环,可以根据需要打印数据。

像PHP中那样转义
失败。我也试过了,但似乎触发了一个错误。这太棒了!但我想分别回显每个值,其中显示:回显“”;foreach($ind=>$value){echo''.$value.

';}echo';所以它会说:回声';foreach($ind=>$value){echo''.$value1.

';echo''.$value2.

';echo''.$value3.

';}echo';其中value1是第一个数字,value2是括号中的表达式,value3是最后三个数字。
echo''。$values[0].

'
您可以使用索引键
[0][1][2]
访问不同的数组项。我已经为你更新了一个额外的部分来演示答案。非常感谢!工作起来很有魅力。我怎样才能使这段代码适用于preg_match_all(“/(?你想实现什么?我答案中的正则表达式已经将
()
之间的内容剥离了。最好对这些结果进行字符串修改,而不是“正则表达式”“这更让人难以理解。如果你能解释你想要达到的目标,我可以在答案中添加一个小例子。实际上,这是第二个问题;下次不要犹豫,从总体上提出一个新问题。长时间的评论聊天不是StackOverflow的工作方式:)
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
        )
)
<?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>';
    }
}

?>