2017-05-05 11 views
0

英数字以外の文字列またはアンダースコアとピリオドの間のすべての文字列を取得するにはどうすればよいですか?たとえば、以下の文字列の場合は[sources_1st,sources]となります。 https://stackoverflow.com/a/10596688/1032531も同様の質問でしたが、私にとってはうまくいかないようです。ピリオドの前に英数字の文字列をすべて検索する

<?php 

function check($pattern,$str) 
{ 
    echo($pattern.'<br>'); 
    preg_match($pattern, $str, $matches); 
    echo('<pre>'.print_r($matches,1).'</pre>');  
} 
$str='fullname("protocol",coalesce(sources_1st.protocol,sources.protocol))'; 
echo($str.'<hr>'); 

check('/[^.]+\.[^.]+$/',$str); 
check('/[\w]\..*$/',$str); 
check('/[^\w]\..*$/',$str); 
check('/\w\..*$/',$str); 
check('/\w+(?=.*\.)$/',$str); 
check('/\w+(?=.*\\.)$/',$str); 
check('/\b[^ ]+\.$/',$str); 
check('/\b[^ ]+\\.$/',$str); 
check('/.*?(?=\.)$/',$str); 

出力:正規表現の下に使用

fullname("protocol",coalesce(sources_1st.protocol,sources.protocol)) 
-------------------------------------------------------------------------------- 
/[^.]+\.[^.]+$/ 

Array 
(
    [0] => protocol,sources.protocol)) 
) 

/[\w]\..*$/ 

Array 
(
    [0] => t.protocol,sources.protocol)) 
) 

/[^\w]\..*$/ 

Array 
(
) 

/\w\..*$/ 

Array 
(
    [0] => t.protocol,sources.protocol)) 
) 

/\w+(?=.*\.)$/ 

Array 
(
) 

/\w+(?=.*\.)$/ 

Array 
(
) 

/\b[^ ]+\.$/ 

Array 
(
) 

/\b[^ ]+\.$/ 

Array 
(
) 

/.*?(?=\.)$/ 

Array 
(
) 
+0

は、あなたが私たちに与えてくださいでした入力がどのように見えるのか、出力はどのようなものになるのでしょうか? – jrn

+0

@jrn入力は '' fullname( "protocol"、coalesce(sources_1st.protocol、sources.protocol)) ''です。出力は '['sources_1st'、 'sources']' – user1032531

答えて

2

あなたは非単語文字とピリオドの間にワード文字と一致することができます:

\W\K\w+(?=\.) 

Live demo

説明:

  1. \W離れ試合非単語の文字
  2. \Kスロー前回のマッチ
  3. \w+(?=\.)期間

PHPコードまでの任意のワード文字:

preg_match_all('~\W\K\w+(?=\.)~', $str, $matches) 
+0

です。前のマッチは、各マッチの前に '\ W'の非単語文字ですか? – user1032531

+0

ようこそ。はい。 – revo

+1

良い解決策。 – user1032531

関連する問題