1

好的,这会很奇怪,但我需要它

我正在尝试获取某些特定引号之间的大量代码行的字符数“。基本上我需要能够获取开头的第 3 个引号和结尾的第 5 个引号之间的所有内容。

所以这是一个例子

a:2:{s:10:"categories";s:5758:"...........";s:5:"posts";s:6:"a:0:{}";}

我需要知道所有时期的字符数。实际上有代码代替了这些句点。

因为有 11 个句点,所以我的字符数将是 11。唯一一致的是这里的引号,所以我需要以此为基础。

任何帮助都是极好的。

这是我的代码。我基本上是在创建代码并添加一些自定义标签。我在反序列化之前尝试先序列化代码,但这似乎不起作用。

<?
$thisisit .= 'a:2:{s:10:"categories";s:5481:"a:40:{';
include('connect.php');

$sql = "SELECT * FROM wp_terms ORDER BY term_id ASC LIMIT 40"; 
$result = mysql_query($sql);
$count = 0;
while($row = mysql_fetch_array($result)) {
    $name = $row['name'];
    $charactercount = strlen($name);
    $term_id = $row['term_id'];
    $thisisit .= 'i:'.$count.';a:2:{s:11:"filter_name";s:20:"add_keyword_category";s:11:"filter_args";a:7:{s:12:"filter_value";s:'.$charactercount.':"'.strtolower($name).'";s:19:"filter_search_title";s:1:"1";s:21:"filter_search_excerpt";i:0;s:21:"filter_search_content";s:1:"1";s:21:"faf_filter_categories";a:1:{i:4;s:3:"'.$term_id.'";}s:17:"filter_match_word";i:0;s:17:"filter_match_case";i:0;}}';
    //echo "<br><br>";
    $count++;
}
$thisisit .= '}";s:5:"posts";s:6:"a:0:{}";}';

$array = unserialize($thisisit);
echo strlen($array['categories']);
?>
4

1 回答 1

2

实际上这个数据看起来是序列化的。正确的解决方案是使用 php 函数unserialize

然后,给定您的结构,了解该元素的长度:

strlen(unserialize($data)['categories']);

如果您运行旧 php,则需要将结果存储在临时变量中:

$array = unserialize($data);
echo strlen($array['categories']);

如果您的序列化数据已损坏(如“未从正确执行serialize”中收到),如您的示例所示,我们可以返回您的原始任务:

获取开头的第 3 个报价和结尾的第 5 个报价之间的所有内容

实现这一目标的最简单方法是:

implode("'", array_slice(explode("'", $data), 3, -5));
于 2013-10-04T06:32:29.757 回答