0

我有以下$content字符串。我也有title和可选的icon值。我想获取标题的所有值,但我想检查该标题是否有一个图标,然后我也想获取它。

我可以使用preg_match_all. 但是我无法找出如何检查是否有图标并显示它。

我正在尝试以下代码:

$content = '[sc-item title="Item1 Title" icon="icon-bullet"] Lorem ipsum dolor sit amet[/sc-item][sc-item title="Item2 Title"] Lorem [/sc-item]';

$titles = array();
preg_match_all( '/sc-item title="(.*?)"/i', $content, $matches, PREG_OFFSET_CAPTURE );
preg_match_all( '/icon="(.*?)"/i', $content, $icon_matches, PREG_OFFSET_CAPTURE );

if( isset($matches[1]) ){ 
    $titles = $matches[1]; 
}

if( isset($icon_matches[1]) ){ 
    $icons = $icon_matches[1]; 
}

foreach( $titles as $title ){
    echo $title[0];
    //echo $icon[0];
}

在上面的示例中,第一个标题旁边有 和图标,而第二个标题没有。所以我只想得到第一个标题+图标和第二个标题。

4

1 回答 1

1

使用这个正则表达式:

preg_match_all('/sc-item title="(.*?)"\s+(?:icon="(.*?)")?/i', $content, $matches);

去实现你不想要的。这是您的两个正则表达式的组合。

解释为(?:...)?

  • (?:...)定义一个不可捕获的组(不出现在结果数组中$matches
  • ?最后意味着它是可选的。

如果strlen($matches[$i][2])等于0没有图标。

但是我建议你先匹配所有sc-item的s,然后解析它们的属性。因此,您可以更灵活地使用属性的顺序:

$content = '[sc-item icon="icon-bullet" title="Item1 Title" other="false"] Lorem ipsum dolor sit amet[/sc-item][sc-item title="Item2 Title"] Lorem [/sc-item][sc-item title="Item3 Title" icon="icon-bullet"] Lorem [/sc-item]';

preg_match_all('/\[sc-item(.+?)\]/i', $content, $matches);

echo'<pre>'; //var_dump($matches);

foreach($matches[1] as $m) {
    $attrs = getAttributes($m);

    var_dump($attrs);
}

function getAttributes($attrsAsStr) {
    preg_match_all('/\s*(.+?)\s*=\s*"(.+?)"/', $attrsAsStr, $attrs, PREG_SET_ORDER);

    $attrsArr = array();

    foreach($attrs as $attr) {
        $attrsArr[$attr[1]] = $attr[2];
    }

    return $attrsArr;
}
于 2013-11-11T07:45:54.487 回答