如何使用php中的preg match从文件中输出数据

问题描述

我已使用此代码生成输出 (file.PHP)

<?PHP

function getContents($str,$startDelimiter,$endDelimiter) {
  $contents = array();
  $startDelimiterLength = strlen($startDelimiter);
  $endDelimiterLength = strlen($endDelimiter);
  $startFrom = $contentStart = $contentEnd = 0;
  while (false !== ($contentStart = strpos($str,$startFrom))) {
    $contentStart += $startDelimiterLength;
    $contentEnd = strpos($str,$endDelimiter,$contentStart);
    if (false === $contentEnd) {
      break;
    }
    $contents[] = substr($str,$contentStart,$contentEnd - $contentStart);
    $startFrom = $contentEnd + $endDelimiterLength;
  }

  return $contents;
}


$sample = '
<start>One<end>
<start>Two<end>
<start>Four - 565<end>
<start>Five - 556<end>
';
$v = getContents($sample,'<start>','<end>');

$result = preg_filter('/[0-9]+/','($0)',$v);

foreach ($result as $value => $name) {
    echo $name;
    echo "<br>";
}




?>

实际输出的是什么

Four - (565)
Five - (556)

例如:127.0.0.1/file.PHP?username=Four 当我们转到那个 url 时,它的号码是 565

有没有办法用 PHP 实现这一点?

解决方法

好吧,如果您想保留此非 XML 数据,并且不想向我们提供有关数据大小的更多信息,也不想在搜索项旁边没有数字时提供回复方式,那么您可以开始用一个像这样的简单正则表达式。

正则表达式:<start>Four[\s-]*(\d*)<end>

在这里玩它:https://regex101.com/r/p0aaGG/1
您将在 regex101.com 上获得对正则表达式的解释:

  • 在 PHP 中,正则表达式必须由开始和结束字符包围,然后可以在后面添加一些标志。大多数情况下,我们像在 JavaScript 中一样使用 / 分隔符。但有些人使用 #~。例子:
    • /Teddy/i 将查找单词 Teddy 但不区分大小写。
    • ~Teddy~i 是完全相同的正则表达式,但用另一个分隔符编写。这就是为什么 preg_quote() 有第二个参数来指定使用的分隔符,如果它不是通常的斜杠 /
  • \s 表示任何类型的空格字符。
  • [\s-] 表示任何类型的空格字符或 - 字符。
  • [\s-]* 表示可以是 0 次或多次。
  • \d 表示任何数字字符。
  • \d* 表示任意数字字符 0 或多次。
  • () 用于捕获,以便我们稍后在 $matches 数组中获取它。

现在,如果 <start><end>Four 是参数,那么您可以在 PHP 中执行此操作:

<?php

$sample = '<start>One<end>
<start>Two<end>
<start>Four - 565<end>
<start>Five - 556<end>';

function getContents($username,$startDelimiter,$endDelimiter) {
    global $sample;
    
    // The pattern (regex) looks like this: /<start>Four[\s-]*(.*?)<end>/
    $pattern = '/' .
        preg_quote($startDelimiter) .
        preg_quote($username) .
        '[\s-]*(\d*)' .
        preg_quote($endDelimiter) .
        '/';
    
    $matches = [];
    if (preg_match($pattern,$sample,$matches)) {
        return $matches[1];
    }
    else {
        return false;
    }
}

// Test all usernames.
$usernames = [
    'One','Two','Four','Five','unknown user'
];

foreach ($usernames as $username) {
    $result = getContents($username,'<start>','<end>');
    echo "Result for '$username' is " . var_export($result,true) . "\n";
}

这个示例脚本的结果是:

Result for 'One' is ''
Result for 'Two' is ''
Result for 'Four' is '565'
Result for 'Five' is '556'
Result for 'unknown user' is false

对于@mebak:

如果您只想要结果,则不要对测试的用户进行循环并从 PHP 为我们填充的 $_GET$_POST 数组中读取用户名:

// Same as above and then just this:

if (isset($_GET['username'])) {
    $username = $_GET['username'];
}
elseif (isset($_POST['username'])) {
    $username = $_POST['username'];
}
else {
    die("Missing username!");
}

print getContents($username,'<end>');