我有一些代码如下,我正在使用正则表达式来删除某些内容:
内容
[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"/]
,以便它只选择第二个?
希望有道理:-)
答案 0 :(得分:1)
"#\[dt_divider[^\]]*\]([^\[]*)\[/vc_#Us"
在尽可能少地更改正则表达式时应该解决您的问题。与您的尺寸一样,价格将在捕获组1中。
正则表达式的问题在于.*
尝试尽可能多地匹配。
我正在使用[^\]]*
和[^\]]*
来替换两个.*
。这些代表匹配0到*
或]
[
\]
或\[
的许多("#\[dt_divider[^\]]*\]\s*([^\[]*?)\s*\[/vc_#Us"
)字符。
略有改进的版本是:
{{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 。