2012-03-28 16 views
0

私は特定の文字列の後に単語/フレーズ(ハッシュタグでラップされている)を選択しようとしています。たとえば、文字列の後に単語を選択するにはどうすればよいですか?

これは例の段落で、ハッシュタグのアーティスト名の後ろに@calvinharris#feelel#と書いてあるように、単語/句を取得しようとしています。

今、私は正常に使用して、文字列からすべての@wordsをつかむことができました:

preg_match_all('[email protected](.+)(?:\s|$)!U', $string, $matches) 

をしかし、私は簡単にハッシュタグ囲まれたフレーズをつかむことができる方法はあり(彼らはそこにいる場合) @nameの後ろに?

答えて

2

次の正規表現してみてください。

^@(.+)#(.+)#$ 

そして、あなたは、スペース

^@(.+)\S*#(.+)\S*#$ 

そして、あなたは

^@\S*(.+)\S*#\S*(.+)\S*#$ 

多くをトリミングしたいそして、あなたがわからない場合は削除する場合がハッシュタグがあります(またはそれがwatheverと呼ばれます)

^@\S*(.+)\S*(#\S*(.+)\S*#)?$ 
+1

なぜアンカーを使用するのですか? '@'は文字列の先頭にありません。 – erm410

+0

彼のケースでは、 '@calvinharris #feel so close#'は '@'が先頭にあります – grifos

+0

これは、文字列にハッシュがないことと一致しません。 –

1

これはトリックを行う必要があります。

preg_match_all('/@(\w+)\s?(?:#([^#]+)#)?/', $string, $matches); 

$matches[1]「アーティスト名は」 $matches[2]は、あなたのキャラクターはできるだけ具体的に設定することを覚えておいてくださいオプションのフレーズ

1

が含まれています含まれています:

preg_match_all('[email protected]([^\s]+) #([^#]+)#!U', $string, $matches) 

[^\s]+は、最大一致します最初の空白、[^#]+は終了ハッシュタグまで一致します。

1

これは(なし/ /区切り文字が含まれています)トリックを行うようだ:

@(\S+)\s+#(.+?)# 

「1以上の非空白文字、#で囲まれた一部の文字に続いて、1またはそれ以上の空白が続く」

ハッシュ内のテキストに貪欲でない演算子(?)を使用することに注意してください。

EDIT:

preg_match_all後、$マッチ[1]アーティスト名に対応します、$マッチ[2]ハッシュタグ内のテキスト

+0

これは文字列に#が含まれている場合にのみ一致します。彼らはこの質問ではオプションです。 –

1

にあなたが簡単にグループとするpreg_matchを使用してこれを行うことができます。

$name = "calvinharris"; 
preg_match('/@'.$name.' #([\w\s]+)#/', "This is an example paragraph and I am trying to get the word/phrase after the artist name which is in hash tags, such as @calvinharris #feel so close#. ", $match); 
echo '$match = ' . $match[1]; //feel so close 

アイデアはグループ化(角括弧内のもの)を使用してこのグループを取得することです。

関連する問題