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
)