【问题标题】:PHP Regex using preg_split使用 preg_split 的 PHP 正则表达式
【发布时间】:2016-03-12 22:21:23
【问题描述】:

我需要从一个字符串中提取 2 个部分并将它们放入一个数组中。

$test = "add_image_1";

我需要确保此字符串以“add_image”开头并以“_1”结尾,但仅在最后存储数字部分。我想使用 preg_split 作为一种学习体验,因为我将来需要使用它。

我不知道如何使用这个函数来找到一个准确的单词(我尝试使用“\b”但失败了)所以我改用了“\w+”:

$result = preg_split("/(?=\w+)_(?=\d)/", $test);
print_r($result);

这很好用,除了它还接受一堆其他无效格式,例如: “add_image_1_2323”。我需要确保它只接受这种格式。最后一位的长度可以大于 1 位。

结果应该是:

Array ( 

    [0] => add_image 

    [1] => 1 

)

我怎样才能使它更安全?

【问题讨论】:

  • preg_split 不是检查格式的工具。 preg_match 更适合这个任务,如果你想提取部分,使用捕获组。

标签: php regex preg-split


【解决方案1】:

以下正则表达式检查 add_image 作为字符串的开头并匹配 _before digit。

正则表达式: (?<=add_image)_(?=\d+$)

说明:

  • (?<=add_image) 在后面寻找add_image

  • (?=\d+$) 向前查找作为字符串结尾并与_ 匹配的数字。

Regex101 Demo

【讨论】:

  • 啊,这就是您查找确切单词的方式,谢谢!我用错了。
  • @Mayron:是的!您使用的是\w+,这意味着字符类[A-Za-z0-9_] 中的任何内容重复了多次。
  • 除此之外,我通过$ 将其标记为字符串结尾,确保一旦在_ 之后遇到一个数字,就没有其他character。所以像add_image_1_23add_image_9sd 这样的模式根本不会匹配。
  • \b 是边界检查。它检查单词边界。阅读更多关于它的信息here
  • 谢谢!欣赏它:)
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多