2

我在数据库中有以下数据

[508] [blah-blah-blah] Random Text
[510] [hello-hello-hello] More random text
[542] [stuff-stuff-stuff] Even more text

这是在相当多的数据库单元中。整个文本块位于一个单元格中,文本的每一行由回车符分隔。

理想情况下,我希望将每行第一个方括号中的数字转换为数组值。我想要结束的数据是:

array(508,510,542)

更重要的是,我想看看如何有效地将第一个数据结构放入数组中。我觉得应该有一种简单有效的方法来使用它,但是,除了一些非常复杂的正则表达式之外,我看不出怎么做:(

任何帮助都会很神奇!

4

3 回答 3

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);      
于 2013-06-13T23:38:08.257 回答
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修饰符来启用多行模式,从而^匹配每行的开头。

于 2013-06-14T01:46:50.510 回答
0

直接从数据库:

mysqli_query("SELECT SUBSTRING_INDEX(SUBSTRING(your_column_name, 1), ']', 1) FROM tablename");

SUBSTRING(str, pos)的工作方式与 php 中的 substr() 类似,因为它提取原始字符串的一部分。

SUBSTRING(your_column_name, 1)表示从索引 1 开始复制“your_column_name”到末尾。

[508] [blah-blah-blah] Random Text
Becomes
508] [blah-blah-blah] Random Text

SUBSTRING_INDEX(str, C, X)复制整个字符串 str 直到第 X 次出现字符 C

SUBSTRING_INDEX(str, ']', 1)表示复制整个字符串,直到第一次出现]

508] [blah-blah-blah] Random Text

变成

508
于 2013-06-13T23:39:57.280 回答