PHP匹配内容

PHP匹配内容,php,preg-match-all,Php,Preg Match All,我有以下$content字符串。我有标题和可选的图标值。我想得到标题的所有值,但我想检查标题是否有图标,然后我也想得到它 我可以使用preg\u match\u all获取所有标题。然而,我无法找到如何检查是否有图标,并显示它 我正在尝试以下代码: $content = '[sc-item title="Item1 Title" icon="icon-bullet"] Lorem ipsum dolor sit amet[/sc-item][sc-item title="Item2 Title"

我有以下
$content
字符串。我有
标题
和可选的
图标
值。我想得到标题的所有值,但我想检查标题是否有图标,然后我也想得到它

我可以使用
preg\u match\u 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];
}
在上面的示例中,第一个标题旁边有和图标,而第二个标题没有。因此,我只想获得第一个标题+图标和第二个标题。

使用此正则表达式:

preg_match_all('/sc-item title="(.*?)"\s+(?:icon="(.*?)")?/i', $content, $matches);
去实现你不想要的。这是两个正则表达式的组合

(?:…)?

  • (?:…)
    定义一个不可捕获的组(不出现在结果数组
    $matches
    中)
  • 结尾表示它是可选的
如果
strlen($matches[$i][2])
等于
0
则没有图标

但我建议您首先匹配所有
sc项
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;
}
$content='[sc item icon=“icon bullet”title=“Item1 title”other=“false”]Lorem ipsum door sit amet[/sc item][sc item title=“Item2 title”]Lorem[/sc item][sc item][sc item title=“item 3 title”icon=“icon bullet”];
preg_match_all('/\[sc项(+?)\]/i',$content,$matches);
回声'//var_dump($matches);
foreach($m与[1]匹配){
$attrs=getAttributes($m);
var_dump($attrs);
}
函数getAttributes($attrsAsStr){
preg_match_all('/\s*(.+?)\s*=\s*“(.+?)”/”,$attrsAsStr,$attrs,preg_SET_顺序);
$attrsArr=array();
foreach($attrs作为$attr){
$attrsar[$attr[1]]=$attr[2];
}
返回$attrsar;
}

非常感谢您的回答,您能再解释一下如何显示标题+图标吗?在上面的例子中,我有foreach循环,我不知道你有多灵活。但这与如下元素不匹配:
[sc item icon=“icon bullet”title=“Item1 title”]
所以我给您一个更好的解决方案,请稍候。