如何解决如何使用php中的preg match从文件中输出数据
<?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>');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。