2016-09-05 15 views
3

文字列から関数の引数を抽出するためにphpの正規表現に苦労しています。私はPHPでjavascriptファイルを解析していて、行から2つの関数の引数を抽出したい。正規表現を使ってphpの文字列からテキストを抽出する

"Backbone.Radio('comments ').trigger("added:comment " ,function(){});" 

私はコメントは追加の単語を抽出したい、このラインから:コメントを任意の空白や引用符なしをここで行が見えるかもしれ方法の例です。

私は試してみました:(コメント "と( "追加:コメント"

を私はどのようにしていくつかの助けをいただければ幸いです

$arrMatches = array(); 
$strRegEx = "/\\(\\s*['\"]\\s*([^)]+?)\\s*['\"]\\s*/"; 
$nMatches = preg_match_all($strRegEx, $strLine, $arrMatches); 

しかし、これは私のような何かを与えます

+0

抽出後に「クリーン」することはできません。それでは、結果を得た後に '('と '' ''と '' ''を削除するか、コメント自体に括弧が含まれている可能性があるので、このメソッドは影響を受けますか? –

+0

抽出後にそれらをきれいにすることができます正規表現は、必要な部分だけを抽出するので、余分なステップは必要ありません。 – sudden01

答えて

2

あなたは使用することができます

<?php 

$regex = '~\(\h*([\'"])(.+?)\h*(?!\\\\)(?=\1)~'; 
$string = "Backbone.Radio('comments ').trigger(\"added:comment \" ,function(){});"; 

preg_match_all($regex, $string, $matches); 
print_r($matches[2]); 
/* 
Array 
(
    [0] => comments 
    [1] => added:comment 
) 
*/ 
?> 

正規表現は、単一/二重引用符を探し、それらをキャプチャし、エスケープされていない次のシングル/二重引用符を探します。 a demo on regex101.comを参照してください。


警告:これはこの特定の例では機能しますが、通常は正規表現を使用する最後の方法です。代わりにパーサーを使用すると考えていましたか?

+0

ありがとうございます!これはうまくいきますが、パーサーを使用すると、この例で使用できるパーサはどれくらいの利点がありますか? – sudden01

+0

@ sudden01:入力文字列に完全に依存します。問題が発生するのは非常にうまくいくでしょう。たとえば、 'Backbone.Radio( 'comment_function(" testparam ")')'というJSネストされた括弧に直面した場合にのみ問題が発生します。 – Jan

+1

フィンe。私がチェックしている行は、常にこの形式になります。あなたの助けをもう一度感謝します。私はあなたの答えを受け入れたものとしてマークします。 – sudden01

1

この例では、次のようになります。

$re = "/(?<=\\()(?:[ '\"]*)([\\w\\d\\:]+)(?=[ ]*['\"]*)/"; 
$str = "\"Backbone.Radio('comments ').trigger(\"added:comment \" ,function(){});\""; 

preg_match_all($re, $str, $matches); 

必要に応じて、一致するグループに他のアイテムを追加できます。

+0

回答がありがとう、これも動作します。私は正規表現の専門家ではないので、どちらのソリューションがベストかは分かりません。 – sudden01

関連する問題