Php Preg_匹配文本文件并在一个代码中显示多个结果
我有一个文本文件(“file.txt”): 使用PHP代码,通过在[number]行中搜索模式来查找第一个单词、括号中的表达式以及最后的3位或4位数字: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
<?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>';
}
}
?>