替换字符串数组中的所有字符串将不起作用

时间:2019-09-18 12:32:59

标签: php arrays foreach str-replace

我有以下字符串

$content = '[tab title="Tab A" content="Tab a content."][tab title="Tab B" content="Tab B content"][tab title="Tab C" content="Tab C content"]';

现在,我想像这样分割内容:

$contentID = preg_split('/(\]\[)|(\]\s*\[)/', $content);

到目前为止,到目前为止,我需要检查$contentID数组的每个字符串是否包含id=部分,以便在丢失时可以添加它:

// set a new array
$newContentID = array();
// set a unique ID
$id = 'unique';

// include an id attribute for each string part
foreach ( $contentID as $i => $tabID ) {
 $newContentID[$i] = !strpos( $tabID, 'id=' ) === true ? str_replace( '[tab', '[tab id="'.$id.'-'.$i.'"', $tabID) : $tabID;
}

最后,我只是将所有内容放入同一$content数组中。

$content = implode('][',$newContentID);

#content的内容如下:

var_dump($content);

/////////////// RESULT ///////////////////
string "[tab id="unique-0" title="Tab A" content="Tab a content."][tab title="Tab B" content="Tab B content"][tab title="Tab C" content="Tab C content"]"


var_dump($contentID);

/////////////// RESULT ///////////////////

array(3) {
  [0]=>
  string(13) "
[tab id="tab-a" title="Tab A" active="1" content="Tab a content""
  [1]=>
  string(13) "tab id="tab-b" title="Tab B" content="Tab B content""
  [2]=>
  string(13) "tab id="tab-c" title="Tab C" content="Tab C content."]
"
}

为什么foreach不做我期望的工作(在缺少的每个字符串部分中添加id)?我该怎么解决?

1 个答案:

答案 0 :(得分:1)

由于preg_split的结果为:

,因此未添加id部分。
array(3) {
  [0]=>
  string(43) "[tab title="Tab A" content="Tab a content.""
  [1]=>
  string(41) "tab title="Tab B" content="Tab B content""
  [2]=>
  string(42) "tab title="Tab C" content="Tab C content"]"
}

这意味着foreach上的str_replace('[tab', '[tab id="'.$id.'-'.$i.'"', $tabID)无法正常工作,因为对于数组索引(1、2),没有字符串[tab可以替换。

一种解决方法是使用以下[tab函数检查strpos是否存在:

$content = '[tab title="Tab A" content="Tab a content."][tab title="Tab B" content="Tab B content"][tab title="Tab C" content="Tab C content"]';

$contentID = preg_split('/(\]\[)|(\]\s*\[)/', $content);

// set a new array
$newContentID = array();
// set a unique ID
$id = 'unique';

// include an id attribute for each string part
foreach ( $contentID as $i => $tabID ) {
 $newContentID[$i] = strpos($tabID, 'id=') === false ? addId($tabID, $id, $i) : $tabID;
}

$content = implode('][',$newContentID);

function addId($tabID, $id, $i) {
    if (strpos($tabID, '[tab') === 0) {
        return str_replace('[tab', '[tab id="'.$id.'-'.$i.'"', $tabID);
    } else if (strpos($tabID, 'tab') === 0) {
        return 'tab id="' . $id . '-' . $i . '"' . substr($tabID, 3);
    }
}

echo $content的结果:

[tab id="unique-0" title="Tab A" content="Tab a content."][tab id="unique-1" title="Tab B" content="Tab B content"][tab id="unique-2" title="Tab C" content="Tab C content"]