如何使用 php 中的预匹配从文件输出数据

How to output data from a file using preg match in php

我已使用此代码生成输出 (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, $startDelimiter, $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]+/', '([=11=])', $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 表示任何类型的 space 字符。
  • [\s-] 表示任何类型的 space 字符或 - 字符。
  • [\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, '<start>', '<end>');