Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用正则表达式获得包含所有图像数字和图像字母的数组?_Php_Regex - Fatal编程技术网

Php 如何使用正则表达式获得包含所有图像数字和图像字母的数组?

Php 如何使用正则表达式获得包含所有图像数字和图像字母的数组?,php,regex,Php,Regex,我需要根据如下格式的表达式获取所有相关图像,用PHP解析html: '/(?:\(fig\.\h*|\G(?!^))(\d+)([a-z])?(?:-([a-z])?)?(?:,\h*)?(?=[^)]*\))/m' (图8a-c、9b-c) 我想使用正则表达式捕捉这一点,以便输出如下数组: array( [8] => [a,b,c], [9] => [b,c]) 表达式可以是以下任何形式: (fig. 8) (fig. 8,9) (fig. 11a, b) 这是我目前拥有的正

我需要根据如下格式的表达式获取所有相关图像,用PHP解析html:

'/(?:\(fig\.\h*|\G(?!^))(\d+)([a-z])?(?:-([a-z])?)?(?:,\h*)?(?=[^)]*\))/m'
(图8a-c、9b-c)

我想使用正则表达式捕捉这一点,以便输出如下数组:

array(
[8] => [a,b,c],
[9] => [b,c])
表达式可以是以下任何形式:

(fig. 8)
(fig. 8,9)
(fig. 11a, b)
这是我目前拥有的正则表达式,但它似乎并不适用于所有情况:


你能帮我得到一个包含所有包含图像的数组吗?感谢

也许对于您的示例数据,您可以使用一个和一个带有3个捕获组的模式,其中第三个组是可选的

如果第三组不存在,则返回数组中的单个值,或者使用第二组和第三组创建范围

(?:^\(fig\.\h*|\G(?!^))(\d+)([a-z])(?:-([a-z])?)?(?:,\h*)?(?=[^)]*\))
  • (?:
    非捕获组
    • ^\(图\.\h*
      匹配字符串的开头和(图),后跟0+水平空白
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是开始处断言位置
  • 关闭非捕获组
  • (\d+)([a-z])
    在组1中捕获1+个数字,在组2中捕获a-z
  • (?:
    非捕获组
    • -([a-z])?
  • )?
    关闭非捕获组并将其设置为可选
  • (?:,\h*)?
    匹配可选的
    和0+水平空白字符
  • (?=[^)]*\)
    断言右边是一个右括号

例如:

$pattern = "/(?:^\(fig\.\h*|\G(?!^))(\d+)([a-z])(?:-([a-z])?)?(?:,\h*)?(?=[^)]*\))/m";
$str = '(fig. 8a-c, 9b-c)
(fig. 8)
(fig. 8,9)
(fig. 11a, b)';
preg_match_all($pattern, $str, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE, 0);

$matches = array_map(function($x){
    if (isset($x[3][0])) {
        return [
            $x[1][0] => range($x[2][0], $x[3][0]),
            "start" => $x[1][1],
            "end" => $x[3][1]
        ];
    }
    return [
        $x[1][0] => [$x[2][1]],
        "start" => $x[2][0],
        "end" => $x[1][1]
    ];

}, $matches);

print_r($matches);
结果

Array
(
    [0] => Array
        (
            [8] => Array
                (
                    [0] => a
                    [1] => b
                    [2] => c
                )

            [start] => 6
            [end] => 9
        )

    [1] => Array
        (
            [9] => Array
                (
                    [0] => b
                    [1] => c
                )

            [start] => 12
            [end] => 15
        )

)
请参阅您可以使用的

'~(?:\G(?!^),\s*|\(fig\.)\s*\K([0-9]{1,3})([a-z]-[a-z])~'
使用
preg\u match\u all
(图…)
子字符串中获取所有字符范围(请参见),然后使用此后处理代码:

$rx = "~(?:\G(?!^),\s*|\(fig\.)\s*\K([0-9]{1,3})([a-z]-[a-z])~";
$s = "(fig. 8a-c, 9b-c)";
preg_match_all($rx, $s, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER, 0);

foreach ($matches as $m) {
    $result = [];
    $result[] = $m[0][1]; // Position of the match
    $result[] = $m[1][0]; // The number
    $kv = explode("-", $m[2][0]);
    $result = array_merge($result, buildNumChain($kv));
    print_r($result);
}

function buildNumChain($arr) {
    $ret = [];
    foreach(range($arr[0], $arr[1]) as $letter) {
        $ret[] = $letter;
    }
    return $ret;
}
输出:

Array ( [0] => 6  [1] => 8 [2] => a [3] => b [4] => c )
Array ( [0] => 12 [1] => 9 [2] => b [3] => c )

正则表达式详细信息

  • (?:\G(?)
  • \s*
    -0+空格
  • \K
    -匹配重置运算符
  • ([0-9]{1,3})
    -第1组:1到3位数字
  • ([a-z]-[a-z])
    -第2组:小写字母、
    -
    和小写字母

    • 谢谢,我最终得到了如下正则表达式:

      '/(?:\(fig\.\h*|\G(?!^))(\d+)([a-z])?(?:-([a-z])?)?(?:,\h*)?(?=[^)]*\))/m'
      

      用于
      preg\u match\u all

      请注意,不可能匹配输入字符串中不存在的内容。
      a-c
      不是
      a-b-c
      。当然可以,但规则是在两者之间插入字母。如果您对此也有线索。。。Thanks@Max这些答案对你有用吗?非常感谢,那么在您的解决方案中,如何将数字与字母范围相关联?以获得类似[8]=>array([0]=>a[1]=>b[2]=>c)的内容?此外,我忘了提及我需要获取整个表达式的位置,因此我将添加PREG_OFFSET_CAPTURE作为标志。非常感谢您的帮助,很抱歉我忘了提及我还需要使用PREG_OFFSET_CAPTURE检索整个表达式位置,因此我如何修改您的解决方案以使用此约束?注意,您可以n单击左侧的向上箭头,向上投票帮助您的答案。