PHP如何从带引号字符串中提取包含等号、空格的属性键值对?
你遇到的属性值丢失问题,是因为拆分键值时explode('=', $item)没有限制拆分次数,会把属性值内部的等号也作为分隔符拆分,仅取了拆分后的第二个元素,导致等号后的内容丢失。下面提供两种可直接使用的修改方案:
方案1:仅修改键值拆分逻辑,不改动原有正则
只需给explode增加第三个参数限制拆分次数为2即可,保证第一个等号后的所有内容都归为属性值:
$args = preg_split('/"[^"]+"(*SKIP)(*F)|\h+/', $shortcode); $attrs = []; foreach( $args as $item ) { //仅处理数组$args中包含等号的元素 if ( strpos( $item , '=' ) !== false ) { // 限制最多拆分为2段,避免值内部的等号被拆分 $sep = explode( '=', $item, 2 ); $key = $sep[0]; $value = $sep[1]; $attrs[$key] = str_replace( '"', '', $value ); } }
方案2:直接匹配键值对(更稳定,无需拆分步骤)
不用提前拆分整个短代码,直接通过正则匹配所有属性键值对,容错性更高:
// 直接匹配所有 属性名="属性值" 结构 preg_match_all('/(\w+)\s*=\s*"([^"]*)"/', $shortcode, $matches); $attrs = array_combine($matches[1], $matches[2]);
两种方案都可以得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者bestprogrammerintheworld
相关产品推荐
相关产品推荐

