我在db
中有以下数据[508] [blah-blah-blah] Random Text
[510] [hello-hello-hello] More random text
[542] [stuff-stuff-stuff] Even more text
这是相当多的db细胞。整个文本块位于单元格中,文本的每一行都用回车符分隔。
理想情况下,我希望每行第一个方括号中的数字为数组值。我想最终得到的数据是:
array(508,510,542)
更重要的是,我想看看如何有效地将第一个数据结构转换为数组。我觉得应该有一种简单有效的方法来使用它,但是,除了一些非常复杂的正则表达式之外,我看不出怎么做:(
任何帮助都是神奇的!
答案 0 :(得分:3)
在PHP中,您可以使用preg_match_all()
<?php
$string = '[508] [blah-blah-blah] Random Text
[510] [hello-hello-hello] More random text
[542] [stuff-stuff-stuff] Even more text';
preg_match_all ('!(?<=\[)([0-9]+)(?=\])!',$string,$matches);
print_r($matches[0]);
?>
输出
Array
(
[0] => 508
[1] => 510
[2] => 542
)
要处理数据库中的所有记录,您可以执行以下操作:
$result = mysqli_query($sql);
$records = array();
while ($row = mysqli_fetch_array($result)){
preg_match_all ('!(?<=\[)([0-9]+)(?=\])!',$row['my_text_field'],$matches);
foreach($matches[0] as $value){
$records[]=$value;
}
}
print_r($records);
答案 1 :(得分:1)
鉴于您的数字始终出现在每一行的开头,表达式非常简单:
$input = <<<EOM
[508] [blah-blah-blah] Random Text
[510] [hello-hello-hello] More random text
[542] [stuff-stuff-stuff] Even more text
EOM;
preg_match_all('/^\[(\d+)\]/m', $input, $matches);
print_r($matches[1]);
我正在使用/m
修饰符启用多行模式,导致^
与每行的开头匹配。
答案 2 :(得分:0)
直接从DB:
mysqli_query("SELECT SUBSTRING_INDEX(SUBSTRING(your_column_name, 1), ']', 1) FROM tablename");
SUBSTRING(str, pos)就像在php中的substr()一样,它会提取原始字符串的一部分。
SUBSTRING(your_column_name, 1)
表示将“your_column_name”从索引1复制到结尾。
[508] [blah-blah-blah] Random Text
Becomes
508] [blah-blah-blah] Random Text
SUBSTRING_INDEX(str, C, X)复制整个字符串str,直到字符C的第X次出现
SUBSTRING_INDEX(str, ']', 1)
表示复制整个字符串,直到第一次出现
508] [blah-blah-blah] Random Text
变为
508