PHP / MySQL preg_match слова, начинающиеся с символа хеш - PullRequest
0 голосов
/ 01 сентября 2011

Я разработал систему тегов для своего веб-сайта, в которой теги, начинающиеся с хеша (#), отличаются от тех, которые не используются.Я пытаюсь извлечь все хеш-теги из моей базы данных и загрузить их в массив:

$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
  )

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 01 сентября 2011

Как говорит @NullUserException, это плохой дизайн для помещения сериализованных значений в СУБД, делая это просто усложняющим.

А по вашему вопросу вы можете попробовать другой способ:

$result = array_filter(explode(',', $wrds), function($a){ return $a[0]==='#' } );
0 голосов
/ 01 сентября 2011

использование preg_match_all:

$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
)
0 голосов
/ 01 сентября 2011

попробуйте это регулярное выражение: preg_match("/^\#\w+$/", $wrds, $matched);

...