php - 如果使用 PHP 找不到,则使用默认值进行正则表达式分组

标签 php regex

这是一个示例字符串:

$text = 'foo (20/50) bar () baz (11/30)';

我需要的输出是这样的:

$items = array(
   array(
      "title" => "foo",
      "number" => 20
   ),
   array(
      "title" => "bar",
      "number" => 0
   )
   array(
      "title" => "baz",
      "number" => 11
   )
);

尝试

到目前为止,我一直在使用

$matches_title = array();
$matches_number = array();
preg_match_all('!([^\s]+)!',$text,$matches_title);
preg_match_all('!(?<=\()(\d+)(?=\/)!',$text,$matches_number);

然后循环遍历匹配项以捕获值。显然,当其中一个括号为空时,这不起作用,因为两个数组的长度不同。

如何解决这个问题?

最佳答案

您可以使用以下 php 代码:

$text = 'foo (20/50) bar () baz (11/30)';
preg_match_all('~([\w-]+)\h*\((\d*)(?=[/)])~', $text, $m);

$items = array();
foreach($m[1] as $i => $v) {
   $n = $m[2][$i];
   $items[] = array( "title" => $v, "number" => (empty($n) ? 0: $n) );
}
print_r($items);

输出:

Array
(
    [0] => Array
        (
            [title] => foo
            [number] => 20
        )

    [1] => Array
        (
            [title] => bar
            [number] => 0
        )

    [2] => Array
        (
            [title] => baz
            [number] => 11
        )

)

关于php - 如果使用 PHP 找不到,则使用默认值进行正则表达式分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696451/

相关文章:

php - 使用 ajax 和 jquery 加载部分页面,但在 url 中显示 GET 变量

php - 如何使用 php 命令行在一行中获取多个标准输入

php - 即使在 PHP IF.. 语句之后,选择选项仍然出现在页面上

javascript - Jquery删除字符串中除单词之间的所有空格不起作用

c# - 分隔字符串并将其放入列表框中

regex - 在 bash 中将字符串从 app.js 重命名为 app.min.js

php - 如何使用nginx重定向同一目录下的多个文件?

php - include_once() 和条件包含之间是否存在开销差异?

java - 支持字母表的 24 小时制的正确正则表达式是什么 (java)

javascript - 使用 RegEX 匹配 URL 模式,无效量词?