[英]PHP regex second occurrence
我有一些类似下面的代码,并且我使用正则表达式提取某些内容:
内容
[vc_row][vc_column width="1/1"][vc_column_text]
[dt_divider style="thin"/]
size 18" x 18"
[dt_divider style="thin"/]
£70
[/vc_column_text]
我使用以下方法来获取大小:
preg_match_all("#\[dt_divider.*\](.*)\[dt_#Us", $content, $matches3);
$picsize = $matches3[1][0];
print $picsize;
然后尝试使用以下方法获取价格:
preg_match_all("#\[dt_divider.*\](.*)\[/vc_#Us", $content, $matches4);
$price = $matches4[1][0];
print $picsize;
上面的代码只是排列:
Array ( [0] => Array ( [0] => [dt_divider style="thin"/] size 18" x 18" [dt_divider style="thin"/] £70[/vc_ ) [1] => Array ( [0] => size 18" x 18" [dt_divider style="thin"/] £70 ))
如何获得忽略第一个[dt_divider style="thin"/]
,使其仅拾取第二个?
希望有道理:-)
"#\[dt_divider[^\]]*\]([^\[]*)\[/vc_#Us"
应该解决您的问题,同时尽可能少地更改正则表达式。 与您的尺寸一样,价格将在捕获组1中。
正则表达式的问题是.*
试图尽可能匹配。
我正在使用[^\\]]*
和[^\\]]*
替换两个.*
。 这些说匹配0到许多( *
不属于)字符]
或[
( \\]
或\\[
)。
稍作改进的版本将是:
"#\[dt_divider[^\]]*\]\s*([^\[]*?)\s*\[/vc_#Us"
这样做完全一样,但是价格周围的空白(换行符)将被排除在匹配之外。
您应该可以使用\\[dt_divider style="thin"\\/\\]\\s*£([\\d\\.]+)
捕获它
比赛群组: [121-123]
70
preg_match_all("/^\[dt_divider style=\"thin\"\/\][\n\r]+\s*\K[^\n\r]+/m", $s, $m)
在此处查看演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.