2013-03-21 4 views
3

Я использую это:регулярное выражение для извлечения хэш-тегов без пробелов

$t = "#hashtag #goodhash_tag united states #l33t this"; 
$queryVariable = ""; 
if(preg_match_all('/(^|\s)(#\w+)/', $t, $arrHashTags) > 0){ 
    array_filter($arrHashTags); 
    array_unique($arrHashTags); 
    $count = count($arrHashTags[2]); 
    if($count > 1){ 
     $counter = 1; 
     foreach ($arrHashTags[2] as $strHashTag) { 
      if (preg_match('/#\d*[a-z_]+/i', $strHashTag)) { 
       if($counter == $count){ 
        $queryVariable .= $strHashTag;    
       } else{ 
        $queryVariable .= $strHashTag." and "; 
       } 
       $newTest = str_replace($arrHashTags[2],"", $t);     
      } 
      $counter = $counter + 1; 
     } 
    } 
} 
echo $queryVariable."<br>"; // this is list of tags 
echo $newTest; // this is the remaining text 

Выходной сигнал на основе вышеприведенного $t является:

#hashtag and #goodhash_tag and #l33t 
united states this 

Первая проблема:

если $t = '#hashtag#goodhash_tag united states #l33t this'; то есть без промежуток между двумя тегами, выход будет следующим:

#hashtag and #l33t 
#goodhash_tag united states this 

Вторая проблема:

если $t = '#hashtag #goodhash_tag united states #l33t this #123'; т.е. с неверным тегом #123 это как-то мешает мой список тегов извлеченный в $queryVariable как выход становится

#hashtag and #goodhash_tag and #l33t and // note the extra 'and' 
united states this 

Пожалуйста, помогите на этих двоих, если кто-нибудь?

+0

Я бы очень признателен, если бы кто-нибудь мог как-то помочь в решении вопроса :) – coder101

+0

Небольшое предложение было бы использовать '(# [A-z _] \ w +)' вместо этого. =) – hjpotter92

+0

@DreamEater вы имеете в виду, в строке, где используется 'preg_match', и хотите ли вы, чтобы я заменил весь шаблон или его часть? – coder101

ответ

5

Вместо использования большого количества сравнений и т. Д. Для вашего регулярного выражения. Вы можете просто следующее:

$t = "#hashtag #goodhash_tag united states #l33t this #123#tte#anothertag sth"; 
$queryVariable = ""; 
preg_match_all('/(#[A-z_]\w+)/', $t, $arrHashTags); 
print_r($arrHashTags[1]); 

Чтобы получить их в виде строки с and присоединиться к ним, вы можете использовать взрываться.

$queryVariable = implode($arrHashTags[1], " and "); 

Для остального текста, вы можете иметь preg_replace или str_replace (в зависимости от того вы комфортно).


Адрес codepad link.

+0

Хотя ваш ответ кажется все мои потребности, спасибо за это. У меня есть один вопрос, хотя, вы уверены, что все сравнения, которые я делал, будут позаботиться об этом коде, который вы предложили? – coder101

+0

@ coder101 За исключением части 'array_unique', да. Вы также можете добавить эту функцию. – hjpotter92

+0

также что вы думаете о 'array_filter', чтобы отфильтровать любые значения NULL? – coder101

Смежные вопросы