【发布时间】:2017-09-19 23:52:39
【问题描述】:
我正在尝试匹配带引号的字符串列表并获取每个带引号的子字符串。 PHP 的preg_match_all 验证引用字符串的列表,但返回的“$matches”不包含所有引用的子字符串——通常它只返回第一个和最后一个。
我尝试将名称 (?P<name>) 分配给表达式的组件,但这似乎只会导致结果重复,而且我仍然没有收到所有引用的子字符串。
使用DEFINE 为组件创建子例程并没有改善结果。
以下是我尝试匹配的输入示例。
'abcd','efgh"ij','list,543','Brown fox.','left(paren','right)paren'
下面是我正在使用的表达式。请注意,字符串只能用单引号引起来。
/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/
对preg_match_all 的调用如下所示:
$pregex = '/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/';
echo 'Match result: '.preg_match_all($pregex, $text_list, $matches, PREG_PATTERN_ORDER)."\n";
执行后,$matches 包含:
Array
(
[0] => Array
(
[0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren'
)
[1] => Array
(
[0] => 'abcd'
)
[2] => Array
(
[0] => ,'right)paren'
)
[3] => Array
(
[0] => 'right)paren'
)
)
...我注意到它是字符串“Brown fox”。更改为“Brownfox.”,这是一个问题,它没有列出所有引用的子字符串。
我想看到的是类似的(注意返回的子字符串的开头没有逗号,但如果它们必须在那里,那就这样吧):
Array
(
[0] => Array
(
[0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren'
)
[1] => Array
(
[0] => 'abcd'
)
[2] => Array
(
[0] => 'efgh”ij'
)
[3] => Array
(
[0] => 'list,543'
)
[3] => Array
(
[0] => 'Brown fox.'
)
[3] => Array
(
[0] => 'left(paren'
)
[3] => Array
(
[0] => 'right)paren'
)
)
我想我的问题是:
- 是否可以使用 preg_match_all 完成我想要的?
- 如果有可能,那么我做错了什么或没有做错什么 明白吗?
- 如果有可能,那么我该如何完成 需要解析吗?
谢谢!
【问题讨论】:
-
$string = explode(',',$string); $string = array_map('trim',$string,array_fill(0,count($string),"'")); -
或者如果你想坚持使用正则表达式..
preg_match_all("~'([^']+)'~",$string,$matches);print_r($matches); -
谢谢!我会试一试!我不确定“~”是做什么的,但我会查一下。
-
它是模式分隔符。您在模式中使用了
/。但是你基本上可以使用任何东西。我个人赞成~,因为原因 -
没关系 - "~" 是表达式的分隔符!
标签: php regex preg-match-all