PHP/MySQL preg_匹配以哈希符号开头的单词

PHP/MySQL preg_匹配以哈希符号开头的单词,php,mysql,regex,arrays,preg-match,Php,Mysql,Regex,Arrays,Preg Match,我为我的网站设计了一个标签系统,其中标签以散列函数开头与没有散列函数的标签不同。 我正在尝试从数据库中提取所有哈希标记,并将它们加载到数组中: $keywords = mysql_query("SELECT Keywords FROM Tags WHERE Keywords LIKE '#%'") or die("Query failed with error: ".mysql_error()); $stack = array(); while ($row = mysql_fetch_array

我为我的网站设计了一个标签系统,其中标签以散列函数开头与没有散列函数的标签不同。 我正在尝试从数据库中提取所有哈希标记,并将它们加载到数组中:

$keywords = mysql_query("SELECT Keywords FROM Tags WHERE Keywords LIKE '#%'") or die("Query failed with error: ".mysql_error());
$stack = array();
while ($row = mysql_fetch_array($keywords))
{
    $wrds = $row['Keywords'];
    $val = preg_match("/\b\#\w+(?=,|\b)/", $wrds, $matched);
    while (!empty($matched))
    {
        $val = array_pop($matched);
        if (array_search($val, $stack) === FALSE)
        {
            array_push($stack, $val);
    }
    }
}
MySQL查询返回以下内容:

+------------------------+
| Keywords               |
+------------------------+
| #test1, test           |
| #test1, #test2, #test4 |
| #test3, #est5          |
| #test3                 |
+------------------------+
我想要一个如下所示的数组:

Array(
  [0] => #test1
  [1] => #test2
  [2] => #test4
  [3] => #test3
  [4] => #est5
  )

我做错了什么?

试试这个regexp:preg\u match/^\\w+$/,$wrds,$matched

正如@NullUserException所说,将序列化值放入RDBMS是一种糟糕的设计,这样做只会使事情变得复杂

对于您的问题,您可以尝试另一种方式:

$result = array_filter(explode(',', $wrds), function($a){ return $a[0]==='#' } );
使用preg_match_all:

输出:


为什么要将序列化的值放在RDBMS中?这是。它将在将来,即使你得到这个工作。谢谢,但这只是返回“test3”。我没有得到它,抱歉。以这种方式存储strinhs的原因是什么?我知道这是一种糟糕的设计,但我还没有找到一种方法来有效地从另一个表中为一行检索多行。基本上,我在另一个表中有线程信息,每个线程都有一个id。如果不连续查询标记表,我无法在while循环中从“Tags”表中检索15行并将其连接到“Topic”表中的一行。我在while循环中有这样的信息:选择LEFTTopics.Body,500,Topics.Title,Topics.id作为tID,Topics.Timestamp,Topics.MemberID、Users.id、Users.FirstName、Users.LastName、Tags.Keywords、,COUNTComments.id AS NumberOfComments FROM Topics LEFT JOIN Topics.MemberID=Users.id LEFT JOIN Comments ON Topics.id=Comments.TopicID LEFT JOIN Tags ON Topics.id=Tags.TopicID GROUP BY Topics.id ORDER BY Topics.Timestamp LIMIT$plim但如果标记表中有7个字段与该主题匹配,则只检索第一个字段。@Miles,RE:合并行数据。你可以。例如,见。该小组的讨论是不同的。。。第二个问题的解决方案是可以接受的,因为存储列只包含简单的值,所以可以通过正常的DB操作比较、联接对其进行操作。@outis:非常感谢您提供这些链接!我已经设法让它在没有序列化值的情况下工作。
$arr = array('#test1, test','#test1, #test2, #test4','#test3, #est5','#test3');
$stack = array();
foreach($arr as $wrds) {
    $val = preg_match_all("/#\w+(?=,|$)/", $wrds, $matched);
    while (!empty($matched[0])) {
        $val = array_pop($matched[0]);
        if (array_search($val, $stack) === FALSE)
        {
            array_push($stack, $val);
        }
    }
}
print_r($stack);
Array
(
    [0] => #test1
    [1] => #test4
    [2] => #test2
    [3] => #est5
    [4] => #test3
)