我有$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];
}
在上面的示例中,第一个标题旁边有图标,而第二个标题没有。所以我想获得第一个标题+图标和第二个标题。
答案 0 :(得分:1)
使用此正则表达式:
preg_match_all('/sc-item title="(.*?)"\s+(?:icon="(.*?)")?/i', $content, $matches);
实现你想要的。它是你的两个正则表达式的组合。
(?:...)?
(?:...)
定义了一个无法捕获的组(未出现在结果数组中$matches
)?
表示它是可选的。如果strlen($matches[$i][2])
等于0
则没有图标。
但我建议您首先匹配所有sc-item
,然后解析其属性。因此,您可以更灵活地处理属性的顺序:
$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;
}