Php 如何使用正则表达式从字符串返回单词?
我有一些数据看起来像:Php 如何使用正则表达式从字符串返回单词?,php,regex,Php,Regex,我有一些数据看起来像: {i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";} 我需要删除引号内的所有项目,例如69,70,…,77 我知道我应该使用preg\u split功能 我正在寻找有关需要传递到preg_split以返回所需数据的正则表达式的帮助 编辑 对不起,我最初的问题不清楚。我想收集语音标记之间的
{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}
我需要删除引号内的所有项目,例如69,70,…,77
我知道我应该使用preg\u split
功能
我正在寻找有关需要传递到preg_split
以返回所需数据的正则表达式的帮助
编辑
对不起,我最初的问题不清楚。我想收集语音标记之间的所有值,并将它们返回到一个数组中(我对保留其余数据不感兴趣-我只需要语音标记中的值)
编辑2
数据是一个序列化的对象,为了节省空间,我没有包含完整的对象。如果确实要删除引号之间的所有数字,只需使用
$string = preg_replace('/"[0-9]+"/', '""', $string);
如果要删除这两个选项之间的所有内容,请使用
$string = preg_replace('/"[^"]+"/', '""', $string);
对于您编辑的问题:
preg_match_all('/"([^"]+)"/', $string, $matches);
$matches将包含一个包含字符串的数组。如果确实要删除引号之间的所有数字,只需使用
$string = preg_replace('/"[0-9]+"/', '""', $string);
如果要删除这两个选项之间的所有内容,请使用
$string = preg_replace('/"[^"]+"/', '""', $string);
对于您编辑的问题:
preg_match_all('/"([^"]+)"/', $string, $matches);
$matches将包含一个包含字符串的数组。类似的操作应该可以:
$str = '{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$str = preg_replace('#:"[^"]*"#', '', $str);
echo $str . "\n";
像这样的方法应该会奏效:
$str = '{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$str = preg_replace('#:"[^"]*"#', '', $str);
echo $str . "\n";
没有regexp:
$v = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$v = unserialize($v);
print_r($v);
$v = array_combine(array_keys($v), array_fill(0, count($v), ''));
echo serialize($v);
但是,正如max所提到的,这看起来像是一个(部分)序列化对象。您应该检查您是否能够使用它的完整语法 更新 如果您只需要这个序列化数组的值,那么就更容易了:
$v = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$v = unserialize($v);
$v = array_values($v);
print_r($v);
输出:
Array
(
[0] => 69
[1] => 70
[2] => 71
[3] => 72
[4] => 73
[5] => 74
[6] => 75
[7] => 76
[8] => 77
)
array\u values()
实际上甚至不是必需的。没有regexp:
$v = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$v = unserialize($v);
print_r($v);
$v = array_combine(array_keys($v), array_fill(0, count($v), ''));
echo serialize($v);
但是,正如max所提到的,这看起来像是一个(部分)序列化对象。您应该检查您是否能够使用它的完整语法 更新 如果您只需要这个序列化数组的值,那么就更容易了:
$v = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$v = unserialize($v);
$v = array_values($v);
print_r($v);
输出:
Array
(
[0] => 69
[1] => 70
[2] => 71
[3] => 72
[4] => 73
[5] => 74
[6] => 75
[7] => 76
[8] => 77
)
array\u values()
实际上甚至不是必需的。这将更有用
$data = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$data = unserialize($data);
echo implode(',',$data);
这将更有用
$data = 'a:9:{i:0;s:2:"69";i:1;s:2:"70";i:2;s:2:"71";i:3;s:2:"72";i:4;s:2:"73";i:5;s:2:"74";i:6;s:2:"75";i:7;s:2:"76";i:8;s:2:"77";}';
$data = unserialize($data);
echo implode(',',$data);
这看起来像是由数据库生成的数据。使用此函数将其转换为数组、编辑并转换回数组不是更容易吗?请给我们一个结果示例。我同意Max。。。您必须在字符串的开头添加
a:NUMBER\u OF_ELEMENTS
。我编辑了我的答案,只搜索引号之间的字符串。(但获取这些值的方法确实很奇怪。)这看起来像是由。使用此函数将其转换为数组、编辑并转换回数组不是更容易吗?请给我们一个结果示例。我同意Max。。。您必须在字符串的开头添加a:NUMBER\u OF_ELEMENTS
。我编辑了我的答案,只搜索引号之间的字符串。(但这确实是一种奇怪的获取这些值的方法。)应该注意的是,这个表达式也删除了前面的冒号。所以是:2:“71”;'变成“s:2;”。这可能是询问者想要的,但不是他们说的。@MattH。很好的一点,但最初我并没有抓住:
,字符串只剩下:代码>,我觉得这不太合适,所以我没有太大的自由在正则表达式中包含:
。应该注意的是,这个表达式也删除了前面的冒号。所以是:2:“71”;'变成“s:2;”。这可能是询问者想要的,但不是他们说的。@MattH。很好的一点,但最初我并没有抓住:
,字符串只剩下:
这在我看来并不正确,所以我几乎没有自由地将:
包含在正则表达式中。