2017-04-25 18 views
1

でPHPの正規表現を取得します私が欲しいたとえば、私が持っている文字列

[wateverこれまで常緑] @watever以下の文字列

@kirbypanganja [カービーPanganja] ELOW @kyraminerva [キーラ]テスト@username [Full Name]と一致する部分文字列を取得するには、本当に正規表現のもので新しいです。 ffコードを使用して私:

$mention_regex = '/@([A-Za-z0-9_]+)/i'; 
preg_match_all($mention_regex, $content, $matches); 
var_dump($matches); 

ここで$ contentは上記の文字列です。 配列@username [フルネーム]形式を持つことができるように、正しい正規表現にする必要がありますか?

+0

大括弧で囲まれたすべての値を一致させたいだけですか?なぜなら、それが名前であるかどうかを知る方法がないからです。 – Jerodev

+0

単純な '$ array = explode( '@'、$ yourstring);'配列( 'kirbypanganja [Kirby Panganja] elow'、 'kyraminerva [Kyra ]テスト '、' .... '); ' – JustOnUnderMillions

答えて

0

正規表現:/@[A-Za-z0-9_]+\[[a-zA-Z\s]+\]/

/@[A-Za-z0-9_]+\[[a-zA-Z\s]+\]/これが一致する

例:@thanSomeCharacters[Some Name Can contain space]

Try this code snippet here

<?php 
$content='@kirbypanganja[Kirby Panganja] elow @kyraminerva[Kyra] test @watever[watever ever evergreen]'; 
$mention_regex = '/@[A-Za-z0-9_]+\[[a-zA-Z\s]+\]/i'; 
preg_match_all($mention_regex, $content, $matches); 
print_r($matches); 
あなたが使用することができ
1

@[^]]+] 

すなわち:

$string = "@kirbypanganja[Kirby Panganja] elow @kyraminerva[Kyra] test @watever[watever ever evergreen]"; 
preg_match_all('/@[^]]+]/', $string, $result); 
print_r($result[0]); 

出力

Array 
(
    [0] => @kirbypanganja[Kirby Panganja] 
    [1] => @kyraminerva[Kyra] 
    [2] => @watever[watever ever evergreen] 
) 

PHP Demo

Regex Demo and Explanation

0

私は私が最善であると信じて非常に直接的、ワンライナー方式で開始し、その後、他のオプションを議論...

コード(Demo)よ:

$string = "@kirbypanganja[Kirby Panganja] elow @kyraminerva[Kyra] test @watever[watever ever evergreen]"; 

$result=preg_split('/(?<=\]) [^@]+ /',$string,null,PREG_SPLIT_NO_EMPTY); 

var_export($result); 

出力:

array (
    0 => '@kirbypanganja[Kirby Panganja]', 
    1 => '@kyraminerva[Kyra]', 
    2 => '@watever[watever ever evergreen]', 
) 

パターン(Demo):

(?<=\]) #only match what immediately follows a closing square bracket 
[^@]+  #match a space, 1 or more non-at-signs, then a space 

私のパターンは、ページ上の非常にわずか3位フィニッシュで20個の手順を取ります。 しかし、私は人間のユーザに顕著な影響はないので、嗜好の基準はコーダのユーザビリティに移行すると主張します。

preg_split()を使用して、コーダに2つの利点があります。

  1. が、それはfalseを/ trueを返すも、それは条件文なしでワンライナーとして使用できることを意味しpreg_match_all()などの出力変数を必要としません。 。
  2. preg_match_all()のような2次元配列に対して、1次元配列を返します。これは、返された配列全体が、サブ配列にアクセスすることなく展開する準備ができていることを意味します。

あなたは3番目と4番目のパラメータはpreg_split()であるか不思議に思っている場合は、null値は、ストリングの無制限の量を返すことを意味します。これはデフォルトの動作ですが、パラメータ4のプレースホルダとして使用されます。PREG_SPLIT_NO_EMPTYは、入力文字列の先頭または末尾で分割しようとすると生成される空の部分文字列を効果的に削除します。私のお勧めの方法を終了


は、今私は現在、このページに掲載他の回答を比較する瞬間を取るよ、と、私はお勧めしませんいくつかの非正規表現の方法を提示します。

最も一般的で直感的な方法は、preg_match_all()の正規表現パターンを使用することです。サヒルとペドロの両方は、この行動コースを選択した。

サヒールのパターン/@[A-Za-z0-9_]+\[[a-zA-Z\s]+\]/iは正しく18の段階で必要な部分文字列にマッチしますが、文字クラスにA-Za-zを使用しているにもかかわらずi修飾子/フラグを使用してのように、不必要な冗長性を使用しています...のは、彼らが選択したパターンを比較してみましょう。ここにはdemoがあります。

ペドロのパターン/@[^]]+]/は、目的の文字列を12ステップで正しく一致させます。ここにはdemoがあります。

すべての比較によって、Pedroの方法は同等の精度、より高い効率、およびパターンの簡潔さを高めるため、Sahil'sの方が優れています。 preg_match_all()を使用したい場合は、Pedro'sよりも洗練された正規表現パターンは見つかりません。

つまり、目的の部分文字列を抽出する他の方法があります。まず、私はお勧めしないだろう正規表現を伴わない、より面倒な方法...

正規表現フリー法:strpos() & substr()

$result=[]; 
while(($start=strpos($string,'@'))!==false){ 
    $result[]=substr($string,$start,($stop=strpos($string,']')+1)-$start); 
    $string=substr($string,$stop); 
} 
var_export($result); 
常に非正規表現のアイデアを楽しまなければならない

コーダーメソッドを使用して文字列を解析しますが、上のコードからわかるように、この場合は分かりません。各反復で4つの関数呼び出しが必要であり、読むのが最も簡単なことではありません。だからこのメソッドを却下しましょう。ここで

は、正しい結果を提供する別の方法です...

$result=[]; 
foreach(explode('@',$string) as $v){ 
    if($v){ 
     $result[]='@'.substr($v,0,strrpos($v,']')+1); 
    } 
} 

これは、以前の正規表現のない方法に比べて少ないの関数呼び出しを行うが、それはまだあまりにも多く、このような単純なタスクのために取り扱います。

この時点で、最も賢明な方法は正規表現を使用する必要があることは明らかです。 preg_match_all()を選択することに何も問題はありません。これが私のプロジェクトだったら、私はそれを使うことにします。しかし、直接性を考えることが重要ですpreg_split()。この関数はexplode()と同じですが、正規表現パターンを使用することができます。この質問は、preg_split()の完璧な段階です。省略すべき部分文字列を目的の部分文字列間の区切り文字としても使用できるためです。

関連する問題