【问题标题】:Unable to make use of PHP regex matches无法使用 PHP 正则表达式匹配
【发布时间】:2015-12-26 09:36:09
【问题描述】:

我有一些 PHP 代码接受来自 HTML 表单的上传文件,然后使用正则表达式读取它以查找特定行(在下面的例子中,那些带有“数字”后跟整数的行)。

正则表达式匹配我想要的整数,但当然它们在 $matches 中作为字符串返回。我需要检查整数是否在 0 到 9 之间,但无论我尝试什么,我都无法做到这一点。

使用 intval() 或 (int) 首先将匹配项转换为整数总是返回 0,即使给定的字符串只包含整数。并且由于某种原因,使用 in_array 将整数与 0-9 作为字符串的数组进行比较总是返回 false 。这是故障码...

$myFile = file($myFileTmp, FILE_IGNORE_NEW_LINES);
$numLines = count($myFile) - 1;
$matches = array(); 
$nums = array('0','1','2','3','4','5','6','7','8','9');
for ($i=0; $i < $numLines; $i++) {
    $line = trim($myFile[$i]);
    $numberMatch = preg_match('/Number(.*)/', $line, $matches);
    if ($numberMatch == 1 and ctype_space($matches[1]) == False) { // works up to here
       $number = trim($matches[1]); // string containing an integer only
       echo(intval($number)); // conversion doesn't work - returns 0 regardless
       if (in_array($number,$nums)) { // searching in array doesn't work - returns FALSE regardless
          $number = "0" . $number;
       }
    }
}

我已经尝试过类型检查、双引号、单引号、修剪空格、UTF8 编码……还有什么可能?我要彻底放弃这个应用了,请救救我。

【问题讨论】:

  • 您的示例代码不完整,因为不可重现。输入数据(您所说的是文件)丢失。现在,我不想说您应该在此处发布您的文件,但您需要提供一个示例,其中包含显示您的问题所需的尽可能少的代码和数据。实现这一点的一个好方法是从头开始创建一个新示例,并使用尽可能少的代码来显示您的问题。这不仅是您更好地理解自己的代码的好方法(而且通常它已经为您提供了答案),而且由于它更具体,它还创造了一个更好的问题。

标签: php regex string


【解决方案1】:

例如,使用 '===' 表示 eq

if 1 == '1' then true;
if 1 === '1' false;
if 1 == true then true;
if 1 === true then false

你可以显示文件吗?

【讨论】:

  • 您也许可以用长词来表示“eq”,并解释 == 和 === 之间的区别以及为什么 - 在您看来 - 在这个问题的上下文中有所不同。跨度>
  • eq 我介意 eqvivalent(我不知道如何正确)。 if (in_array($number,$nums)) 这不对。 in_array 返回搜索键。如果键 = 0 = 假。 if(in_array($number,$nums)) 不起作用,因为返回 0 这个键数组,但对于 if 0 是 false。因为使用if(in_array($number,$nums) !== false)这个正确的构造
  • sory 等于,对不起我的英语。
  • 你在评论中给出的好例子!别难过,我的英语也不好。也许更多的练习。但是 in_array 只返回布尔值,而不是键。这可以通过 array_keys 和使用搜索值来实现。 hth(希望有帮助)。
  • 是的,对不起,array_keys 返回键...这个例子太糟糕了。
【解决方案2】:

您在问题中写道,您正在使用正则表达式来查找术语“数字”后跟一个数字 (0-9)。

它的正则表达式是:

/Number(\d)/

它将在匹配组 1 中包含您要查找的数字(数字)。

你使用的模式:

/Number(.*)/

在第一个匹配组中可以包含任何内容(除了换行符)。显然匹配太多了。然后,您会遇到太多追溯过滤的问题。

通常最好首先看起来尽可能精确,而不是事后摆弄太多噪音。

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2018-01-11
    • 2016-01-01
    相关资源
    最近更新 更多