php - 使用 preg_match_all() 和结束字符匹配一个字符串中的多个项目

标签 php regex pcre

我有以下代码:

preg_match_all('/(.*) \((\d+)\) - ([\d\.\d]+)[,?]/U',
    "E-Book What I Didn't Learn At School... (2) - 3525.01, FREE Intro DVD/Vid (1) - 0.15",
    $match);
var_dump($string, $match);

并获得以下输出:

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(54) "E-Book What I Didn't Learn At School... (2) - 3525.01,"
  }
  [1]=>
  array(1) {
    [0]=>
    string(39) "E-Book What I Didn't Learn At School..."
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
  [3]=>
  array(1) {
    [0]=>
    string(7) "3525.01"
  }
}

仅匹配一个项目...我需要的是从这些字符串中获取所有项目。当我在字符串末尾添加“,”符号时 - 它工作得很好。但这在每个字符串中添加逗号是没有意义的。有什么建议吗?

最佳答案

尝试这个正则表达式:

(.*?)\s*\((\d+)\)\s*-\s*(\d+\.\d+)(?:,\s*)?

主要区别在于您有 .* (贪婪),我将其替换为 .*? (非贪婪)。您首先“吃掉”整个字符串(除了换行符),然后回溯以仅匹配字符串中的一个片段。

演示:

preg_match_all('/(.*?)\s*\((\d+)\)\s*-\s*(\d+\.\d+)(?:,\s*)?/',
    "E-Book What I Didn't Learn At School... (2) - 3525.01, FREE Intro DVD/Vid (1) - 0.15",
    $matches, PREG_SET_ORDER);
print_r($matches);

产生:

Array
(
    [0] => Array
        (
            [0] => E-Book What I Didn't Learn At School... (2) - 3525.01, 
            [1] => E-Book What I Didn't Learn At School...
            [2] => 2
            [3] => 3525.01
        )

    [1] => Array
        (
            [0] => FREE Intro DVD/Vid (1) - 0.15
            [1] => FREE Intro DVD/Vid
            [2] => 1
            [3] => 0.15
        )

)

关于php - 使用 preg_match_all() 和结束字符匹配一个字符串中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575124/

相关文章:

javascript - laravel 5中使用ajax插入数据时页面刷新且数据不会添加

regex - 可以将包含有序交替的正则表达式重写为仅使用无序交替吗?

php - 有没有办法在多行上编写 REGEX 模式?

homebrew - 如何使用 Homebrew 软件安装 pcre?

Python:从正则表达式中排除空格

python - 单词不以数字开头

php - 只有一半的推送通知到达设备 (APNS)

javascript - 使用ajax数据刷新div的更有效方法

php - 向帖子添加额外的零

regex - 如何在找到内容后立即使正则表达式匹配接下来的 4 个字符?