来自字符串的PHP preg_match

时间:2014-02-22 12:50:55

标签: php regex

我有这个字符串:

$content = 'Hello <!--blapi[getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png"]--> Hello<!--blapi[prix_p1->description]-->';

如何在数组[2]中获得两个字符串<!--*-->

我已经做到了:

$pattern = '/<!--blapi\[(.*)\]-->/sU';
preg_match($pattern, $content, $matches);

但我有这个结果:

array(2) {
  [0]=>
  string(74) "<!--blapi[getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png")]-->"
  [1]=>
  string(60) "getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png")"
}

我不明白为什么忽略第二个字符串<!--blapi[prix_p1->description]--> ...

我使用了标志“U”。也许我想做的事情有更好的模式?

版本: 我期待这个结果:

Array
(
    [0] => getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png"]
    [1] => prix_p1->description
)

2 个答案:

答案 0 :(得分:2)

preg_match_all应该有效:

$content = 'Hello <!--blapi[getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png"]--> Hello<!--blapi[prix_p1->description]-->';
if ( preg_match_all('/<!--.*?\[(.*?)\]-->/', $content, $matches) )
   print_r($matches[0]);

输出

Array
(
    [0] => getinfoprix("prix_p1"=>"1-6048df6;image/purchase-small.png"
    [1] => prix_p1->description
)

答案 1 :(得分:1)

$pattern = '~<!--(blapi\[(?:.*?)\])-->~si';

此模式是否会产生预期效果?我知道您也希望捕获blapi部分。但不确定......

.*U更改为.*?,并在最后添加i以区分大小写。内部blapi是非捕获组,blapi[...]现在是捕获组。

还要避免在/中包装正则表达式,因为它与URL和HTML冲突。使用~,因为它很少使用,更安全。仅仅因为换行符而将http://转移到http:\/\/并不好。

您还需要preg_match_all,因为preg_match只捕获一个匹配项。它主要用于匹配测试,单匹配搜索,但不用于多重匹配搜索。