Php 如何使用正则表达式获得包含所有图像数字和图像字母的数组?
我需要根据如下格式的表达式获取所有相关图像,用PHP解析html: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) 这是我目前拥有的正
'/(?:\(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*)?(?=[^)]*\))
非捕获组(?:
匹配字符串的开头和(图),后跟0+水平空白^\(图\.\h*
或|
在上一个匹配的末尾而不是开始处断言位置\G(?!^)
关闭非捕获组)
在组1中捕获1+个数字,在组2中捕获a-z(\d+)([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(?)
-0+空格\s*
-匹配重置运算符\K
-第1组:1到3位数字([0-9]{1,3})
-第2组:小写字母、([a-z]-[a-z])
和小写字母-
- 谢谢,我最终得到了如下正则表达式:
'/(?:\(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单击左侧的向上箭头,向上投票帮助您的答案。