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';つまり、2つのタグの間にスペースがない場合、出力は次のようになります。

#hashtag and #l33t
#goodhash_tag united states this

2番目の問題:

つまり$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

誰かがこの2つを手伝ってください?

4

1 に答える 1

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は、implodeを使用できます。

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

残りのテキストについては、preg_replaceまたはstr_replace(どちらか快適な方)を使用できます。


これがコードパッドのリンクです。

于 2013-03-21T06:36:14.370 に答える