PHP正则表达式第二次出现

时间:2013-11-27 20:23:05

标签: php regex

我有一些代码如下,我正在使用正则表达式来删除某些内容:

内容

[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"/],以便它只选择第二个?

希望有道理:-)

3 个答案:

答案 0 :(得分:1)

"#\[dt_divider[^\]]*\]([^\[]*)\[/vc_#Us"

在尽可能少地更改正则表达式时应该解决您的问题。与您的尺寸一样,价格将在捕获组1中。

正则表达式的问题在于.*尝试尽可能多地匹配。

我正在使用[^\]]*[^\]]*来替换两个.*。这些代表匹配0到*] [ \]\[的许多("#\[dt_divider[^\]]*\]\s*([^\[]*?)\s*\[/vc_#Us" )字符。

Working Example

略有改进的版本是:

{{1}}

这完全相同,但价格周围的任何空格(换行符)都将从匹配中排除。

答案 1 :(得分:0)

您应该可以使用\[dt_divider style="thin"\/\]\s*£([\d\.]+)

捕获它

匹配群组: [121-123]

70

答案 2 :(得分:0)

preg_match_all("/^\[dt_divider style=\"thin\"\/\][\n\r]+\s*\K[^\n\r]+/m", $s, $m)

参见演示 here